Листинг 1.5. Файл dmenu/dmenu.cpp - часть 5
В приложении определены четыре глобальные переменные типа HMENU, предназначенные для хранения идентификаторов одного меню верхнего уровня (переменная hmenu) и трех временных меню (переменные hmenuFile, hmenuEdit, hmenuHelp).
Меню верхнего уровня создается в функции главного окна приложения во время обработки сообщения WM_CREATE. Созданное пустое меню подключается к главному окну приложения при помощи функции SetMenu:
hmenu = CreateMenu(); SetMenu(hwnd, hmenu);
Далее создаются два временных меню - "File" и "Help", для чего два раза вызывается функция CreatePopupMenu:
hmenuFile = CreatePopupMenu(); hmenuHelp = CreatePopupMenu();
На данный момент все меню пустые. Прежде всего обработчик сообщения WM_CREATE добавляет к меню "File" несколько строк, вызывая соответствующее число раз функцию AppendMenu:
AppendMenu(hmenuFile, MF_ENABLED | MF_STRING, CM_FILENEW, "&New"); AppendMenu(hmenuFile, MF_ENABLED | MF_STRING, CM_FILEOPEN, "&Open"); ....... и т. д. .......
Обратите внимание на способ, которым в меню добавляется разделительная линия:
AppendMenu(hmenuFile, MF_SEPARATOR, 0, NULL);
Если в качестве второго параметра функции AppendMenu указано значение MF_SEPARATOR, третий и четвертый параметр этой функции игнорируются.
Для того чтобы отметить галочкой строку "Demo Version", вызывается функция CheckMenuItem:
CheckMenuItem(hmenuFile, CM_FILEDEMO, MF_BYCOMMAND | MF_CHECKED);
Аналогичным образом формируется меню "Help".
Далее сформированные временные меню "File" и "Help" добавляются к меню верхнего уровня при помощи функции AppendMenu:
AppendMenu(hmenu, MF_ENABLED | MF_POPUP, (UINT)hmenuFile, "&File"); AppendMenu(hmenu, MF_ENABLED | MF_POPUP, (UINT)hmenuHelp, "&Help");
В заключение вызывается функция DrawMenuBar, которая отображает внесенные изменения на экране:
DrawMenuBar(hwnd);
После формирования меню от него в функцию окна начинают поступать сообщения WM_COMMAND.