format PE GUI 4.0
include 'win32ax.inc'
; import data code in the same section
IDM_GETTEXT     equ 0
IDM_CLEAR       equ 1
IDM_EXIT        equ 2
IDC_BUTTON      equ 3
IDC_EXIT        equ 4
IDC_EDIT        equ 5
IDC_MENU        equ 100
IDC_DIALOG      equ 200
size_of_buffer  equ 96
          ; +---------------------------+
          ; | register the window class |
          ; +---------------------------+
start:  xor ebx,ebx
        mov esi,400000h
        invoke RegisterClassEx,esp,sizeof.WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,WndProc,\
        ebx,DLGWINDOWEXTRA,esi,ebx,10005h,COLOR_BTNFACE+1,IDC_MENU,ClassName,ebx
        invoke CreateDialogParam,esi,ClassName,ebx,ebx,ebx

        or          eax,eax
        jz          err1

        mov edi,esp
        mov [edi+sizeof.MSG],eax
@@:     invoke GetMessage,edi,ebx,ebx,ebx
        or eax,eax
        jz exit_msg_loop
        invoke IsDialogMessage,dword[edi+sizeof.MSG],edi
        or eax,eax
        jnz @r
        invoke DispatchMessage,edi
        jmp @r

exit_msg_loop:invoke ExitProcess,0
err1:
        invoke     MessageBox, 0,ErrTxt2,ErrMsgBoxCaption, MB_OK
        jmp         exit_msg_loop

          ; +----------------------+
          ; | the dialog procedure |
          ; +----------------------+
proc WndProc hDlg, uMsg, wParam, lParam
local buffer [size_of_buffer]:BYTE
        lea esi,[buffer]
        mov edi,[hDlg]
        cmp [uMsg],WM_CLOSE
        jz wmCLOSE
        cmp [uMsg],WM_COMMAND
        jz wmCOMMAND
        leave
        jmp [DefDlgProc]
wmCOMMAND:movzx eax,word[wParam]
        cmp [lParam],0
        jz @f; choose menu
; choose button or EditBox
        cmp word[wParam+2],BN_CLICKED
        jne wmBYE
@@:     jmp dword [handlers+eax*4]
GETTEXT:invoke GetDlgItemText,edi,IDC_EDIT,esi,size_of_buffer
        invoke MessageBox,NULL,esi,AppName,MB_OK
        jmp wmBYE
SAYHELLO:push TestString
        jmp @f
CLEAR:  push 0
@@:     invoke SetDlgItemText,edi,IDC_EDIT
        jmp wmBYE
wmCLOSE:invoke DestroyWindow,edi
        invoke PostQuitMessage,0
wmBYE:  ret
handlers dd GETTEXT,CLEAR,wmCLOSE,SAYHELLO,wmCLOSE
endp
;-------------------------------
;experiment variables
TestString db "Wow! I'm in an edit box now",0
AppName    db "Our Third Dialog Box",0
ClassName  db 'DLGCLASS',0

ErrTxt2             db 'Fail to create a window using the Class name',0
ErrMsgBoxCaption    db 'Program Error',0
;-------------------------------         
data import
     library   USER32,   'USER32.DLL',\
               kernel32, 'kernel32.dll'
     import    USER32,\
                        DispatchMessage,        'DispatchMessageA',\     
                        GetMessage,             'GetMessageA',\
                        PostQuitMessage,        'PostQuitMessage',\
                        MessageBox,             'MessageBoxA',\
                        IsDialogMessage,        'IsDialogMessageA',\               
                        SetDlgItemText,         'SetDlgItemTextA',\
                        CreateDialogParam,      'CreateDialogParamA',\
                        GetDlgItemText,         'GetDlgItemTextA',\
                        RegisterClassEx,        'RegisterClassExA',\
                        DefDlgProc,             'DefDlgProcA',\
                        DestroyWindow,          'DestroyWindow'
      import    kernel32,\
                        ExitProcess,            'ExitProcess'
end data
section '.rsrc' resource data readable
;=======================================================================================================
  directory RT_DIALOG,dialogs,\
            RT_MENU,menus



  resource dialogs,IDC_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,DIALOGEXS

   dialog DIALOGEXS,'DLGCLASS',"Iczelion Tutorial #10c: CreateDialogParam+WndProc+Class",10, 10, 230, 60,DS_CENTER+WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU+WS_VISIBLE+WS_OVERLAPPED+DS_MODALFRAME+DS_3DLOOK,,IDC_MENU,'Times New Roman',10
     dialogitem 'EDIT','',IDC_EDIT,15,17,111,13,WS_VISIBLE+ES_LEFT+WS_TABSTOP+ES_AUTOHSCROLL
     dialogitem 'BUTTON',"Say Hello",IDC_BUTTON,141,10,52, 13,WS_VISIBLE+WS_TABSTOP
     dialogitem 'BUTTON',"E&xit",IDC_EXIT,141,26,52, 13,WS_VISIBLE+WS_TABSTOP
   enddialog

  resource menus,IDC_MENU,LANG_ENGLISH+SUBLANG_DEFAULT,mainMenu
     menu  mainMenu
    ;{
      menuitem "Test Controls",0,MFR_POPUP+MFR_END
       ;{
          menuitem "Get Text",IDM_GETTEXT
          menuitem "Clear Text",IDM_CLEAR
          menuseparator
          menuitem 'E&xit',IDM_EXIT,MFR_END
       ;}