- •Лекция 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:
- •Строка состояния
- •Сообщения для строки состояния
Лекция 7
Меню. Строка состояния
Меню
Меню используют для выбора команд и изменения режимов работы приложения. Если строка меню связана с командой, при ее выборе приложение получает сообщение WM_COMMAND и идентификатор этой команды. Основным элементом меню являются строки или графические объекты.
Главное меню находится ниже заголовка окна, и его строки расположены в одну или несколько линий. При выборе строки главного меню, как правило активизируется раздел меню. Раздел меню представляет собой временное меню.
Контекстное (плавающее) меню – временное меню, которое может появится в любой точке рабочей области (как правило при нажатии правой кнопки мыши).
Системное меню – меню, расположенное слева от текста заголовка окна.
По способу создания различают статическое и динамическое меню.
Статическое меню создают до запуска и не изменяют в процесса работы приложения.
Динамическое меню создают в процессе работы приложения и после создания оно может быть изменено.
Элементы меню
Любой элемент меню может быть описан с помощью структуры MENUITEMINFO:
typedef struct tagMENUITEMINFO{
UINT cbSize; |
//Размер структуры |
UINT fMask; |
//Маска параметров меню |
UINT fType; |
//Тип элемента меню |
UINT fState; |
//Состояние элемента меню |
UINT wID; |
//Идентификатор команды, этого элемента |
HMENU hSubMenu; |
//Дескриптор подменю |
||
HBITMAP hbmpChecked; |
//Дескриптор изображения метки для отмеч. |
||
элемента |
|
|
|
HBITMAP hbmpUnchecked; //Дескриптор изображения метки для неотмеч. |
|||
элемента |
|
|
//Определяемое приложением значение, связанное |
ULONG_PTR dwItemData; |
|||
с |
|
|
|
//элементом |
|
//Содержание отображения меню |
|
LPTSTR dwTypeData; |
|||
UINT cch; |
//Длина текста элемента меню или 0 |
||
HBITMAP hbmpItem; |
//Дескриптор изображения элемента |
} MENUITEMINFO, *LPMENUITEMINFO;
Значения поля fMask |
||
Константа |
Со значением каких полей |
|
работать |
||
|
||
MIIM_CHECKMARKS |
hbmpChecked и hbmpUnchecked |
|
MIIM_DATA |
dwItemData |
|
MIIM_ID |
wID |
|
MIM_STATE |
fState |
|
MIIM_SUBMENU |
hSubMenu |
|
MIIM_TYPE |
fType и dwTypeData |
|
Значения поля fType |
|
Константа |
Пояснение |
|
|
Элемент меню отображать графическим объектом, |
|
MFT_BITMAP |
дескриптор которого находится в младшем слове |
|
|
dwTypeData, а поле cch игнорировать. |
|
|
Элемент меню отображать в начале новой строки или |
|
MFT_MENUBARBREAK |
нового столбца. Между столбцами появится вертикальная |
|
|
линия. |
|
MFT_MENUBREAK |
Тоже самое, но между столбцами не появляется |
|
вертикальная линия. |
||
|
||
MFT_RADIOCHECK |
Если hbmpChecked==NULL, то элемент помечать как |
|
радиокнопку |
||
|
||
MFT_RIGHTJUSTIFY |
Выравнивать этот и последующие элементы по правому |
|
краю |
||
|
||
MFT_SEPARATOR |
В качестве элемента отобразить разделитель в виде |
|
горизонтальной линии |
||
|
||
MFT_STRING |
Элемент меню отображать в виде строки, содержащейся в |
|
dwTypeData |
||
|
|
Значения поля fState |
|
|
|
|
Значение |
|
Состояние элемента меню |
|
|
|
MFS_CHECKED |
|
Отмечен |
|
|
|
MFS_DEFAULT |
|
Элемент по умолчанию |
|
|
|
MFS_DISABLED |
|
Заблокирован |
|
|
|
MFS_ENABLED |
|
В активном состоянии |
|
|
|
MFS_GRAYED |
|
Заблокирован |
|
|
|
MFS_HILITE |
|
Подсвечен |
|
|
|
MFS_UNCHECKED |
|
Не отмечен |
|
|
|
MFS_UNHILITE |
|
Не подсвечен |
|
|
|
Алгоритм создания меню
Алгоритм создания меню в общем случае содержит следующие шаги:
1.Создание пустого меню.
2.Вставка элемента в меню.
3.Шаг 2 повторяется столько раз, сколько элементов должно содержать меню.
Алгоритм подключения главного меню к окну и отображения полосы меню:
4.Создание главного меню (аналогично предыдущему алгоритму).
5.Подключение главного меню к окну.
6.Перерисовка полосы меню окна.
Функции создания меню
Создание пустого главного меню: HMENU CreateMenu(void);
Создание пустого временного меню: HMENU CreatePopupMenu(void);
Функция подключения главного меню к окну: BOOL SetMenu(HWND hwnd, HMENU hmenu);
Функция перерисовки строки меню (независимо от состояния окна):
void WINAPI DrawMenuBar(HWND hwnd);
Вставка элементов в меню
Функция вставки элементов в меню:
BOOL InsertMenuItem(HMENU hMenu, UINT uItem,
BOOL fByPosition, LPCMENUITEMINFO lpmii);
hMenu – идентификатор меню,
uItem содержит номер позиции перед которой необходимо вставить новый элемент (если fByPosition = TRUE, иначе – идентификатор команды вставляемого элемента).
lpmii – указатель на заполненную структуру MENUITEMINFO.