NO

Author Topic: Menu example  (Read 399 times)

Offline Vortex

  • Member
  • *
  • Posts: 802
    • http://www.vortex.masmcode.com
Menu example
« on: November 16, 2023, 08:20:33 PM »
Simple menu example using the APIs CreatePopupMenu and AppendMenu.

Code: [Select]
include     DlgBox.inc

.data

DlgBox      db 'DLGBOX',0
text1       db 'File',0
text2       db 'Edit',0
text3       db 'Exit',0
text4       db 'Copy',0

.data?

hMenu       dd ?
hSubMenu1   dd ?
hSubMenu2   dd ?

.code

start:

    invoke  GetModuleHandle,0
    xor     edx,edx
    invoke  DialogBoxParam,eax,ADDR DlgBox,edx,\
            ADDR DlgProc,edx
    invoke  ExitProcess,eax

DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .IF uMsg==WM_INITDIALOG

        invoke  CreateMenu
        mov     hMenu,eax

        invoke  CreatePopupMenu
        mov     hSubMenu1,eax
       
        invoke  AppendMenu,hMenu,MF_POPUP or MF_ENABLED,\
                hSubMenu1,ADDR text1
        invoke  AppendMenu,hSubMenu1,MF_ENABLED,\
                IDM_EXIT,ADDR text3

        invoke  CreatePopupMenu
        mov     hSubMenu2,eax

        invoke  AppendMenu,hMenu,MF_POPUP or MF_ENABLED,\
                hSubMenu2,ADDR text2
        invoke  AppendMenu,hSubMenu2,MF_ENABLED,\
                IDM_COPY,ADDR text4

        invoke  SetMenu,hWnd,hMenu


    .ELSEIF uMsg==WM_COMMAND

        mov     eax,wParam

            .IF ax==IDM_EXIT

                invoke  SendMessage,hWnd,WM_CLOSE,0,0

            .ENDIF

    .ELSEIF uMsg==WM_CLOSE
             
        invoke  DestroyMenu,hMenu
        invoke  EndDialog,hWnd,0

    .ELSE

        xor eax,eax
        ret

    .ENDIF

    mov    eax,1
    ret

DlgProc ENDP

END start
Code it... That's all...

Offline Vortex

  • Member
  • *
  • Posts: 802
    • http://www.vortex.masmcode.com
Re: Menu example
« Reply #1 on: November 18, 2023, 09:05:43 PM »
Same example built with binary resource data and INCBIN :

Code: [Select]
include DlgBox.inc

.data

DlgBox:
INCBIN DlgBox.bin

Menu:
INCBIN MenuRsrc.bin

.data?

hMenu dd ?

.code

start:

    invoke  GetModuleHandle,0
    xor     edx,edx
    invoke  DialogBoxIndirectParam,eax,\
            ADDR DlgBox,edx,ADDR DlgProc,edx
    invoke  ExitProcess,eax

DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .IF uMsg==WM_INITDIALOG

        invoke  LoadMenuIndirect,ADDR Menu
        invoke  SetMenu,hWnd,eax
        mov     hMenu,eax
.
.

Code it... That's all...