format PE GUI 4.0
entry start

include 'C:\Fasm\INCLUDE\win32axp.inc'

IDM_FILE        EQU 100
IDM_START       EQU 105
IDM_STOP        EQU 110
IDM_EXIT        EQU 115
IDM_EDIT        EQU 200
IDM_PREFS       EQU 205
IDM_COLS        EQU 210
IDM_HELP        EQU 300
IDM_INSTRUCTS   EQU 305
IDM_ABOUT       EQU 310

section '.text' code readable executable

    start:
        invoke  GetModuleHandle, 0
        mov     [wc.hInstance],eax
        invoke  RegisterClass, wc
        invoke  LoadMenu, [wc.hInstance], 20
        mov     [menuHnd], eax
        invoke  CreateWindowEx, 0, testClass, testTitle, WS_VISIBLE+WS_OVERLAPPEDWINDOW, 300, 300, 300, 200, NULL, eax, [wc.hInstance], NULL
        mov     [hWndMain], eax
        jmp     msgLoop
;--------------------------------------------------------------------------------------------------

  msgLoop:
        invoke  GetMessage, msg, NULL, 0, 0
        cmp     eax, 1
        jb      endLoop
        jne     msgLoop
        invoke  TranslateMessage, msg
        invoke  DispatchMessage, msg
        jmp     msgLoop
    endLoop:
        invoke  ExitProcess, [msg.wParam]

;--------------------------------------------------------------------------------------------------

proc WindowProc hWnd, wMsg, wParam, lParam

        push    ebx esi edi
        cmp     [wMsg], WM_COMMAND
        je      .wmCommand
        cmp     [wMsg], WM_DESTROY
        je      .wmDestroy
    .defWndProc:
        invoke  DefWindowProc, [hWnd], [wMsg], [wParam], [lParam]
        jmp     .wmFinish
    .wmCommand:
        mov     eax, [wParam]
        and     eax, 0x0FFFF
        cmp     eax, IDM_START
        je      .start
        cmp     eax, IDM_STOP
        je      .stop
        cmp     eax, IDM_EXIT
        je      .wmDestroy
        jmp     .defWndProc
      .start:
                mov     [mii.cbSize], sizeof.MENUITEMINFO
                mov     [mii.fMask], MIIM_DATA + MIIM_ID + MIIM_STRING
                mov     [mii.dwTypeData], stopStr
                invoke  lstrlen, stopStr
                mov     [mii.cch], eax
                mov     [mii.wID], IDM_STOP
                invoke  GetSubMenu, [menuHnd], 0
                invoke  SetMenuItemInfo, eax, 0, TRUE, mii
                jmp     .wmCommandFinish
      .stop:
                mov     [mii.cbSize], sizeof.MENUITEMINFO
                mov     [mii.fMask], MIIM_DATA + MIIM_ID + MIIM_STRING
                mov     [mii.dwTypeData], startStr
                invoke  lstrlen, startStr
                mov     [mii.cch], eax
                mov     [mii.wID], IDM_START
                invoke  GetSubMenu, [menuHnd], 0
                invoke  SetMenuItemInfo, eax, 0, TRUE, mii
      .wmCommandFinish:
        xor     eax, eax
        jmp     .wmFinish
    .wmDestroy:
        invoke  PostQuitMessage, 0
        xor     eax, eax
    .wmFinish:
        pop     edi esi ebx
        ret
endp

;**************************************************************************************************
section '.data' data readable writeable

wc              WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE+1, NULL, testClass
msg             MSG
hWndMain        dd 0
testClass       db "testClass", 0
testTitle       db "Test application", 0
menuHnd         dd ?
stopStr         db '&Stop', 0
startStr        db '&Start',0
mii             MENUITEMINFO

;**************************************************************************************************
section '.idata' import data readable writeable

library kernel32,'KERNEL32.DLL',\
        user32,  'USER32.DLL'

include 'C:\Fasm\INCLUDE\api\Kernel32.inc'
include 'C:\Fasm\INCLUDE\api\User32.inc'

;**************************************************************************************************
section '.rsrc' resource data readable

  ; resource directory

  directory RT_MENU,menus

  ; resource subdirectories

  resource menus, 20, LANG_ENGLISH + SUBLANG_DEFAULT, testMenu

  menu testMenu
       menuitem '&File', IDM_FILE, MFR_POPUP
                menuitem '&Start', IDM_START
                menuseparator
                menuitem 'E&xit', IDM_EXIT, MFR_END
       menuitem '&Edit', IDM_EDIT, MFR_POPUP
                menuitem '&Colours', IDM_COLS
                menuitem '&Preferences', IDM_PREFS, MFR_END
       menuitem '&Help', IDM_HELP, MFR_POPUP + MFR_END
                menuitem '&Instructions', IDM_INSTRUCTS
                menuitem '&About...', IDM_ABOUT, MFR_END