- •Лекция 7
- •Меню
- •По способу создания различают статическое и динамическое меню.
- •Элементы меню
- •Значения поля fMask
- •Алгоритм создания меню
- •Функции создания меню
- •Вставка элементов в меню
- •Вставка строк в меню
- •Значения параметра fuFlags
- •Удаление элементов из меню
- •Функция удаления элемента из меню, не разрушая связанные с ним элементы.
- •Управление состоянием
- •Получение информации о меню
- •Сообщения от меню
- •Сообщение WM_MENUSELECT: поступает в процессе курсора меню по строкам меню. Младшее слово wParam
- •Контекстное меню
- •Пример
- •AppendMenu(hmenuFile, MF_SEPARATOR, 0, NULL);
- •case WM_COMMAND:
- •// Выбрали строки "Open" или "New" в меню "File" case CM_FILEOPEN:
- •//Выбрали строку "Close" из меню "File" case CM_FILECLOSE:
- •// Завершаем работу приложения case CM_FILEEXIT:
- •Присвоение значений по умолчанию событиям нажатия пунктов меню. Заголовочный файл “dmenu.hpp”.
- •Более подробно о работе с меню в WinAPI:
- •Строка состояния
- •Сообщения для строки состояния
Вставка строк в меню
Функция вставки новых элементов в меню:
BOOL WINAPI AppendMenu(HMENU hmenu, UINT fuFlags,
UINT idNewItem, LPCSTR lpszNewItem);
hMenu – идентификатор меню;
fuFlags - определяет атрибуты создаваемого элемента меню;
idNewItem и lpszNewItem - назначение параметров зависит от параметра fuFlags.
Значения параметра fuFlags
Константа |
Описание |
Для изображения строки меню используется графическое изображение bitmap. Если указан MF_BITMAP этот параметр, младшее слово параметра lpszNewItem содержит идентификатор
изображения
MF_CHECKED При выводе меню на экран строка меню отмечается галочкой ""
Строка меню отображается в нормальном виде (не MF_DISABLED серым цветом), но находится в неактивном
состоянии
MF_ENABLED Строка меню разблокирована и отображается в нормальном виде
Строка меню отображается серым цветом и MF_GRAYED находится в неактивном состоянии. Такую строку
нельзя выбрать
|
Если описывается меню верхнего уровня, элемент |
||||
F_MENUBREAK |
меню выводится с новой строки. Если описывается |
||||
временное меню, элемент меню выводится в новом |
|||||
|
столбце |
|
|
|
|
|
Аналогично MF_MENUBREAK, но дополнительно |
||||
MF_MENUBARBREAK |
новый столбец отделяется вертикальной линией |
||||
|
(используется при создании временных меню) |
||||
|
Строка меню рисуется окном, создавшем меню. |
||||
|
Когда меню отображается в первый раз, функция |
||||
|
этого окна получает сообщение WM_MEASUREITEM, |
||||
MF_OWNERDRAW |
в ответ на которое функция окна должна сообщить |
||||
размеры |
области, |
занимаемой |
изображением |
||
|
строки меню. Рисовать изображение строки надо |
||||
|
тогда, когда в функцию окна придет сообщение |
||||
|
WM_DRAWITEM. Флаг MF_OWNERDRAW |
можно |
|||
|
указывать только для временных меню |
|
|||
|
С данным элементом меню связывается временное |
||||
MF_POPUP |
меню. Если используется этот флаг, параметр |
||||
idNewItem |
должен |
содержать |
идентификатор |
||
|
временного меню, связанного с данным элементом |
|
Используется |
для |
создания |
горизонтальной |
|||||||
MF_SEPARATOR |
разделительной линии во временных меню. Если |
||||||||||
указан |
этот |
флаг, |
параметры |
lpszNewItem |
и |
||||||
|
idNewItem не используются |
|
|
|
|
||||||
MF_STRING |
Элемент |
|
меню |
является |
строкой |
символов. |
|||||
Параметр |
lpszNewItem |
должен |
указывать |
на |
|||||||
|
строку символов, закрытую двоичным нулем |
|
|||||||||
MF_UNCHECKED |
При выводе меню на экран строка не отмечается |
||||||||||
галочкой "" |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||
Вы можете указывать сразу несколько флагов, объединив их |
|||||||||||
операцией логического ИЛИ, однако следует иметь в виду, что |
|||||||||||
существует четыре группы взаимно несовместимых флагов: |
|
MF_DISABLED, MF_ENABLED, MF_GRAYED
MF_BITMAP, MF_OWNERDRAW, MF_STRING
MF_MENUBREAK, MF_MENUBARBREAK
MF_CHECKED, MF_UNCHECKED
Удаление элементов из меню
Функция удаления элемента из меню. Если элемент содержит временное меню, то функция удаляет и это меню.
BOOL DeleteMenu(HMENU hMenu,
UINT uPosition, UINT uFlags);
hMenu – дескриптор изменяемого меню, uPosition – определяет удаляемый элемент:
Если uFlags = MF_BYCOMMAND, то значение uPosition – идентификатор удаляемого элемента.
Если uFlags = MF_BYPOSITION, то значение uPosition – номер позиции удаляемого элемента.
Функция удаления элемента из меню, не разрушая связанные с ним элементы.
BOOL RemoveMenu(HMENU hMenu, UINT uPosition, UINT uFlags);
Функция удаления всего меню: BOOL DestroyMenu(HMENU hMenu);
Используя эту функцию можно удалять те меню, которые были созданы, но не подключены. Подключенные меню удаляются при разрушении окна.
Управление состоянием
элемента меню
Функция изменения состояния элемента меню: BOOL SetMenuItemInfo(HMENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
Функция чтения состояния элемента меню: BOOL GetMenuItemInfo(HMENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
В этих функциях, если fByPosition = FALSE, то uItem – идентификатор команды элемента, иначе uItem – номер позиции элемента в меню.
Получение информации о меню
Функция определения главного меню окна: HMENU GetMenu(HWND hwnd);
Функция определения временного меню по его позиции: HMENU GetSubMenu(HMENU hMenu, int nPos);
Функция проверки существования меню: BOOL IsMenu(HMENU hMenu);
Функция определения количества элементов в меню: int GetMenuItemCount(HMENU hMenu);
Сообщения от меню
Сообщение WM_INITMENU: поступает перед отображением главного меню. Параметр wParam равен дескриптору меню.
Сообщение WM_INITMENUPOPUP: поступает перед отображением временного меню. Параметр wParam равен дескриптору меню. Младшее слово параметра lParam равно позиции этого меню в меню верхнего уровня, старшее слово – равно 1 для системного меню и 0 – для обычного.
Сообщение WM_COMMAND: поступает после выбора строки меню. Младшее слово wParam равно идентификатору выбранной команды.
Сообщение WM_SYSCOMMAND: приходит в функцию окна приложения, когда пользователь выбирает строку из системного меню. Параметр wParam содержит идентификатор строки системного меню. Параметр lParam не используется.
Сообщение WM_MENUSELECT: поступает в процессе курсора меню по строкам меню. Младшее слово wParam содержит идентификатор команды или позиции строки (если при выборе строки отображается временное меню), а старшее слово содержит флажки состояния элементов меню:
MF_CHECKED – отмечен;MF_DISABLED – заблокирован;MF_GRAYED – недоступен;MF_HILITE – высвечен;MF_MOUSESELECT – выбран мышью;
MF_POPUP – открывает временное окно;
MF_SYSMENU – принадлежит системному меню окна.