;This will create dialog box as class template and register with RegisterClassEx
format PE GUI 4.0
entry start


 include 'WIN32Ax.inc'
 ;include 'rcWin32.inc'                 ;a custom inc file
 ;--------------------------------------------------------------
 IDR_MAINMENU   =  2000
 IDR_DIALOG     =  2001

 IDC_EDIT       =  5000

 IDB_BUTTON     =  4000


 IDM_HELLO      =  1000
 IDM_CLEAR      =  1001
 IDM_GETTEXT    =  1002
 IDM_EXIT       =  1003
 IDM_EDIT       =  1004
;--------------------------------------------------------------

;/////////////////////////////////////////////////////////////////////////////////////////////////////
 section '.data' data readable writeable
;========================================================================================================
    MenuName            = IDR_MAINMENU
    DlgsName            db 'MNSdlgName',0
    DlgClassName        = IDR_DIALOG
    EditName            db 'EDIT',0
    ButtonClassName     db 'BUTTON',0

    ButtonText          db 'my button',0
    ErrTxt1             db 'Registering window class Failed',0
    ErrTxt2             db 'Fail to create a window using DlgClassName',0
    ErrTxt3             db 'Error in the message loop of the window',0
    ErrMsgBoxCaption    db 'Program Error',0
    TestString          db 'Hello edit',0
    text2               db 'menu',0
    buffer              rb 520

    msg                 MSG
    wc                  WNDCLASSEX
    cmdLine             dd ?
    hInst               dd ?
    hwndDlg             dd ?
    hwndEdit            dd ?
    hwndButton          dd ?
;======================================================================================================
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;//////////////////////////////////////////////////////////

;/////////////////////////////////////////////////////////////////////////////////////////////////////
 section '.code' code readable executable
;=====================================================================================================
    start:
       invoke      GetModuleHandle,0
       mov         [hInst],eax
       invoke      GetCommandLine
       mov         [cmdLine],eax
       stdcall     WinMain,[hInst],NULL,[cmdLine],SW_SHOWDEFAULT
       invoke      ExitProcess,eax

;-----------------------WinMain Procedure-------------------------------------------------------------
       proc WinMain   hInstance:DWORD,hPrvinstance:DWORD,commandLine:DWORD,cmdshow:DWORD


       ;----declare window struct----------------------------
         push        [hInst]
         pop         [wc.hInstance]
         mov         [wc.cbSize], sizeof.WNDCLASSEX
         mov         [wc.style], 0
         mov         [wc.lpfnWndProc],WindowProc
         xor         eax,eax
         mov         [wc.cbClsExtra],eax
         mov         [wc.cbWndExtra],DLGWINDOWEXTRA            ;***** this needed
         mov         [wc.hbrBackground], COLOR_BTNFACE+1
         mov         [wc.lpszMenuName],MenuName
         mov         [wc.lpszClassName],DlgClassName
         invoke      LoadIcon, NULL, IDI_APPLICATION
         mov         [wc.hIcon], eax
         mov         [wc.hIconSm], eax
         invoke      LoadCursor, NULL, IDC_ARROW
         mov         [wc.hCursor], eax

       ;----Registering window class----------
         invoke      RegisterClassEx, wc
         or          eax,eax
         jz          err1;end_loop

       ;-----Create modeless dialogbox---------
         invoke      CreateDialogParam,[hInst],DlgClassName,NULL,0,0
         mov         [hwndDlg],eax
         or          eax,eax
         jz          err2;end_loop

       ;-----Show window----------------------
         invoke      ShowWindow, [hwndDlg],SW_SHOWNORMAL

       ;-----Update window---------------------
         invoke      UpdateWindow, [hwndDlg]

       ;-----Set focus on dialog item-------------
         invoke      GetDlgItem,[hwndDlg],IDC_EDIT          ;return the control's window handle in eax from control id
         invoke      SetFocus,eax
         ;jmp         end_loop

       ;-----message loop----------------------
         msg_loop:
              invoke      GetMessage,msg,NULL,0,0
              cmp         eax,0
              je          end_loop
              jb          err3
              invoke      IsDialogMessage, [hwndDlg],msg
              or          eax,eax
              jnz         msg_loop
              invoke      TranslateMessage,msg
              invoke      DispatchMessage,msg
              jmp         msg_loop

        err1:
              invoke      MessageBox, 0,ErrTxt1,ErrMsgBoxCaption, MB_OK
              jmp         end_loop
        err2:
              invoke      MessageBox, 0,ErrTxt2,ErrMsgBoxCaption, MB_OK
              jmp         end_loop
        err3:
              invoke      MessageBox, 0,ErrTxt3,ErrMsgBoxCaption, MB_OK
              jmp         end_loop

         end_loop:
              mov         eax,[msg.wParam]
              ret
       endp

;----------------------------------------------------------------------------------------------------------

;------------------------------------window procedure------------------------------------------------------
       proc       WindowProc hwnd:DWORD,umsg:DWORD,wParam:DWORD,lparam:DWORD

         push        ebx esi edi
         cmp         [umsg],WM_CLOSE
         je          ..endProgrm
         cmp         [umsg],WM_DESTROY
         je          .wmdestroy
         cmp         [umsg],WM_COMMAND
         je          .Commands
         .defwndproc:
               invoke     DefWindowProc,[hwnd],[umsg],[wParam],[lparam]
               jmp        .finish
         .Commands:
               xor        eax,eax
               mov        eax,[lparam]
               cmp        eax,0
               jne        ..chldCntrl
               mov        eax,[wParam]
               cmp        ax,IDM_EXIT
               je         ..endProgrm
               ;cmp        ax,IDM_HELLO
               ;je         ..wrtStrg
               ;cmp        ax,IDM_CLEAR
               ;je         ..clrStr
               ;cmp        ax,IDM_GETTEXT
               ;je         ..getText
               jmp        .finish

               ..wrtStrg:
                     ;invoke     SetWindowText,[hwndEdit],TestString
                     jmp        .finish

               ..clrStr:
                     ;invoke     SetWindowText,[hwndEdit],0
                     jmp        .finish

                ..getText:
                     ;invoke     GetWindowText,[hwndEdit],buffer,512
                     ;invoke     MessageBox,NULL,buffer,AppName,MB_OK
                     jmp        .finish

               ..chldCntrl:
                     mov        eax,[wParam]
                     cmp        ax,IDB_BUTTON
                     jne        .finish
                     shr        eax,16
                     cmp        ax,BN_CLICKED
                     jne        ..endProgrm
                     ;invoke     SendMessage,[hwnd],WM_COMMAND,IDM_GETTEXT,0
                     jmp        .finish

               ..endProgrm:
                    invoke      DestroyWindow,[hwnd]
         .wmdestroy:
               invoke     PostQuitMessage,0
               xor        eax,eax
         .finish:
               pop     edi esi ebx
        ret
       endp
;---------------------------------------------------------------------------------------------------------
;==========================================================================================================
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;//////////////////////////////////////////////////////////

;//////////////////////////////////////////////////////////////////////////////////////////////////////

 section '.idata' import data readable
;=======================================================================================================
  library kernel32,'KERNEL32.DLL',\
           user32,'USER32.DLL'

  include 'api/kernel32.inc'
  include 'api/USER32.inc'


;=======================================================================================================
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;//////////////////////////////////////////////////////////////////////////////////////////////////////
 section '.rsrc' resource data readable
;=======================================================================================================
  directory RT_DIALOG,dialogs,\
            RT_MENU,menus



  resource dialogs,IDR_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,mydialogbox

   dialog mydialogbox,'dialogBox',70,70,190,175,WS_CAPTION+WS_SYSMENU+DS_MODALFRAME+WS_VISIBLE,,IDR_MAINMENU,'Times New Roman',10
     dialogitem 'EDIT','',IDC_EDIT,10,50,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
     dialogitem 'BUTTON','open',IDB_BUTTON,50,10,52,13,WS_VISIBLE+WS_TABSTOP
     ;dialogitem 'BUTTON','OK',IDOK,10,10,45,15,WS_VISIBLE+WS_TABSTOP
   enddialog

  resource menus,IDR_MAINMENU,LANG_ENGLISH+SUBLANG_DEFAULT,mainMenu
     menu  mainMenu
    ;{
      menuitem '&File',0,MFR_POPUP
       ;{
          menuitem '&Hello',IDM_HELLO
          menuitem '&Clear',IDM_CLEAR
          menuseparator
          menuitem 'E&xit',IDM_EXIT,MFR_END
       ;}
     menuitem '&Edit',IDM_EDIT,MFR_END
    ;}






;=======================================================================================================
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\