API SelectObject : incompréhension du code
Hello,
Le bout de code ci-dessous fonctionne bien, je n'ai aucun problème pendant son exécution, il y a quand même quelque chose qui m'interpelle :
Les handles récupérés au début de la procédure (ligne 1-17) sont passés comme arguments à la fonction BitBlt (ligne 31 & 36). Là ou je coince dans la compréhension de ce code, c'est l'appel de la fonction SelectObject, je ne comprends pas ce qu'elle fait exactement, d'après msdn :
This function selects an object into a specified device context. The new object replaces the previous object of the same type.
J'ai jeté un oeil sur le contenu des registres et les segments de données avant et après l'appel de cette fonction : aucun changements. Sous olly, j'ai patché le code avec un jump de la ligne 20 à 28 pour faire un test, résultat : le bitmap ne s'affiche pas dans ma fenêtre... :mrgreen:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| push dword hdc ; adresse PAINTSTRUCT
push dword [WP1_hWnd] ; handle fenêtre
call [BeginPaint]
mov dword [hdcDestination], eax ; on récupère le handle periph affichage
;================================================================================
push dword TS1Bitmap ; adresse du bitmap
push dword [hInstance] ; ID application
call [LoadBitmapA]
push eax ; on sauvegarde le handle du bitmap
;================================================================================
push dword [hdcDestination] ; on passe le handle bitmap et le
; handle périph d'affichage
; comme arguments à la fonction
; createCompatibleDC
call [CreateCompatibleDC]
mov dword [hdcSource], eax ; on récupère le handle periph mémoire
;================================================================================
]push dword [hdcSource] ; arg=handle periph mémoire et bitmap
; (déjà empilé à la ligne 12)
call [SelectObject] ; ???
;================================================================================
; BitBlt : transfère un bloc de données couleurs vers un rectangle de pixel
; à partir d'un périph source spécifié vers un périph destination
;================================================================================
push dword 00CC0020h ; arg fonction
push dword 0h ; arg fonction
push dword 0h ; arg fonction
push dword [hdcSource] ; handle de périph mémoire
push dword 39 ; arg fonction
push dword 100 ; arg fonction
push dword 0h ; arg fonction
push dword 0h ; arg fonction
push dword [hdcDestination] ; handle pérpiph affichage
call [BitBlt] ; et on appele la fonction BitBlt
;================================================================================
push dword [hdcSource] ; suppression des handles obsolètes
call [DeleteDC] ; et fin de routine
pop eax
push eax
call [DeleteObject]
push dword hdc
push dword [WP1_hWnd]
call [EndPaint] |
Si quelqu'un pouvait m'éclairer...
Merci d'avance.