******************************************************************************
{{{{{{{{{{{{{{{{{{{{{{{{  DIALOGBOX EN WIN32 ASM }}}}}}}}}}}}}}}}}}}}}}}}}}}}}
******************************************************************************

Ce tut va juste vous apprendre a afficher une boite de dialogue en assembleur pour windows. Le tout est fait pour le compilateur Tasm. Pour les resources j'utilise visual c++ mais borland resource workshop est un produit qui donne des resources bien plus lisibles. Question de goùt.

Pour créer votre dialogbox il va tout d'abord falloir la créer grace a un éditeur spécialisé. Moi j'utilise visual c++ 6 mais vous pouvez le faire avec borland resource workshop ou d'autres logiciels. Voila comment on procède avec vc++ :

Faites sous vc++ : File->New->File->resource script puis choisissez le nom que vous lui donnez. Maintenant faites : Insert->resource voila ce que vous avez sous les yeux :



Choisissez dialog puis cliquez sur new. Voila maintenant vous avez une boite de dialogue sous les yeux que vous n'avez qu'a modifier selon vous souhaits. Faites quelquechose ressemblant a ceci :



Double cliquez sur les objets pour changer leurs propriétées. Pour notre exemple on mettra le handle (ID) de la boite a 1000 et celui du bouton a 2000. Ensuite faites save as et enregistrez le en fichier .res.
Pour faire un prog 32 bits on déclare tout d'abord toutes les apis qu'on utilise. Passons maintenant au code source en lui même. Pour afficher une boite de dialogue il faut le faire en quelques étapes.

.386P

Extrn	MessageBoxA:PROC
Extrn	DialogBoxParamA:PROC
Extrn	ExitProcess:PROC
Extrn	GetModuleHandleA:PROC

WM_CLOSE           = 0010h
WM_COMMAND         = 0111h
Bon bah là on à déclaré les APIS qu'on va utiliser et on donne la correspondance de ce que l'on appelle WM_CLOSE et WM_COMMAND.

.Model Flat, StdCall
déclare le modèle de mémoire utilisé
Maintenant on commance le segment de datas:

.Data
hinst   dd 0
message db '!!! Les cours de TiPiaX ça déchirre !!!',0
titre db 'Héhé',0

;----------------------------------------------------------------------------------------------
Début du programme

.Code
 
Start:
	 
    push    0
    call    GetModuleHandleA ; choppe l'hinstance car on en a besoin
    mov     [hinst], eax     ; pour appeler la boite de dialogue

Appel de DialogBoxParamA pour afficher notre boite de dialogue


    push    0              
    push    offset DlgProc    
    push    0
    push    1000
    push    [hinst]
    call    DialogBoxParamA  ; affiche la boite
    jmp     bye
    
;----------------------------------------------------------------------------------------------
Fonction qui gère notre boite de dialogue

DlgProc proc hwnd:DWORD, umsg:DWORD, wparam:DWORD, lparam:DWORD


    cmp     [umsg], WM_CLOSE		 
    jz      bye                   ; saute si on ferme la boite

    cmp     [umsg], WM_COMMAND    ;si pas WM_COMMAND
    jnz     fin                   ;on se barre
      mov eax,wparam
        cmp lparam,0              ;si lparam =0
        jz fin                    ;on saute
          cmp ax, 2000            ;on a cliqué le bouton ?
          jnz fin                 ;si oui on saute pas

            call boitedemessage   ;et on affiche la boite de message
	 
fin:

    ret

DlgProc endp
Fonction qui affiche notre boite de message

boitedemessage proc

push 0               ;bouton ok
push offset titre    ;le titre
push offset message  ;le message
push 0               ;le handle
call MessageBoxA

ret
boitedemessage endp

Ici on quitte le programme

bye:

    push 0
    call ExitProcess

End Start

;----------------------------------------------------------------------------------------------
Le résultat en images :



Pour compiler:
tasm32 /mx /m3 /z /q dialog.asm
tlink32 -x /Tpe /aa /c dialog,dialog,,import32.lib,,resource.res
del dialog.obj
Si vous ne captez pas quelquechose n'hésiter pas a me mailer, je me ferais un plaisir de vous répondre. ps: le prog et le source sont joints.

TiPiaX/VDS