
TBN.ru
|
Меню можно
создать динамически, без создания ресурса.
Программа 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.
wOffset - смещение относительно конца этого поля.
Если первое определение пункта меню следует за
dwHelpId, то wOffset должен быть 4.
dwHelpId - идентификатор подсказки.
Заголовок должен выравниваться по DWORD границе.
Пункт меню:
typedef struct {
DWORD dwType;
DWORD dwState;
UINT uId;
WORD bResInfo;
WCHAR szText[1];
// DWORD dwHelpId;
} MENUEX_TEMPLATE_ITEM;
dwType - тип пункта меню.
dwState - состояние пункта меню.
UINT - уникальный идентификатор.
bResInfo - величина введенная для обозначения
последнего пункта меню, подменю...
szText - текст пункта меню. Это Unicode строка
оканчивающаяся 0, выравнивается по WORD границе.
dwHelpId - идентификатор подсказки. Нужен только при
создании POPUP меню.
Пример:
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
|