Меню можно создать динамически, без создания ресурса.
Программа cr_menu3.asm имеет в памяти шаблон меню, потом из шаблона создаст "объект" меню с
помощью LoadMenuIndirect, которая вернет дискриптор меню. Меню может затем быть добавлено при
создании окна, устанавливая дискриптор меню в соответствующий аргумент CreateWindowEx.
Вы можете также создать окно без меню и потом дополнить используя SetMenu.
Эта функция API может также использоваться для изменения меню. Меню могут удалить
используя NULL вместо дискриптора меню.
push offset MenuTemplate ;шаблон меню
call LoadMenuIndirectA
mov [hMenu], eax ;hMenu - menu handle
Шаблон меню состоит из заголовка и списка пунктов меню.
MENUEX_TEMPLATE_HEADER struct
wVersion dw ?
wOffset dw ?
dwHelpId dd ?
MENUEX_TEMPLATE_HEADER ends
wVersion - версия шаблона, должна быть равна 1.
typedef struct {
DWORD dwType;
DWORD dwState;
UINT uId;
WORD bResInfo;
WCHAR szText[1];
// DWORD dwHelpId;
} MENUEX_TEMPLATE_ITEM;
dwType - тип пункта меню.
MenuTemplate MENUEX_TEMPLATE_HEADER<1,4,0>
; &File
dd MFT_STRING ; Type
dd MFS_ENABLED ; State
dd 0 ; Id
dw MFR_POPUP ; ResInfo
dw '&','F','i','l','e',0,0 ; Text
dd 0 ; HelpId
; MenuItem &GRAYED
dd MFT_STRING ; Type
dd MFS_GRAYED ; State
dd IDM_1 ; Id
dw 0 ; ResInfo
dw 'M','e','n','u','I','t','e','m',' ' ; Text
dw '&','G','R','A','Y','E','D',0
; dd 0 - HelpId only with popup menu
; MenuItem &DISABLED
dd MFT_STRING ; Type
dd MF_DISABLED ; State
dd IDM_2 ; Id
dw 0 ; ResInfo
dw 'M','e','n','u','I','t','e','m',' ' ; Text
dw '&','D','I','S','A','B','L','E','D',0
; dd 0 ; HelpId
; ------------------
dd MFT_SEPARATOR,0,0
dw 0,0
; E&xit
dd MFT_STRING ; Type
dd MFS_ENABLED ; State
dd IDM_EXIT ; Id
dw MFR_END ; ResInfo
dw 'E','&','x','i','t',0,0 ; Text
; dd 0 ; HelpId
; &About
dd MFT_STRING ; Type
dd MFS_ENABLED ; State
dd IDM_ABOUT ; Id
dw MFR_END ; ResInfo
dw '&','A','b','o','u','t',0 ; Text
; dd 0 ; HelpId
Полный текст: cr_menu3.zip