
- •Глава 12 Современный пользовательский интерфейс
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Основные стили окна
- •Флаги расширенного стиля окна
- •Флаги основного стиля элемента управления общего пользования
- •Флаги стиля, специфичные для конкретного элемента управления
- •Посылка сообщений элементам управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Стили окна панели инструментов
- •Задание изображений на поверхности кнопок
- •Заполнение массива tbbutton
- •Пример создания панели инструментов
- •Перемещение и изменение размеров панели инструментов
- •Поддержка элемента управления подсказка
- •Добавление дочерних окон в панель инструментов
- •Резервирование места для дочернего окна на панели инструментов
- •Создание элементов управления на панели инструментов
- •Изменение размеров панели инструментов с дочерними окнами
- •Поддержка окон подсказки для дочерних окон панели инструментов
- •Изменение конфигурации панели инструментов
- •Строка состояния
- •Создание строки состояния
- •Перемещение и изменение размеров строки состояния
- •Поддержка просмотра меню
- •Просмотр элементов меню
- •Просмотр элементов всплывающего меню
- •Просмотр системного меню
- •Программа gadgets
Просмотр элементов меню
Функция MenuHelp вычисляет идентификатор ID строкового ресурса для элемента меню путем добавления значения идентификатора команды (полученного из младшего слова wParam) к значению, на которое ссылается lpwIDs. Например, следующий вызов функции MenuHelp отображает строковый ресурс с номером 125 в строке состояния:
UINT uiStringBase = 100 ;
WPARAM wParam = 25 ;
MenuHelp (WM_MENUSELECT, wParam, lParam, NULL,
hInst, hwndStatus, &uiStringBase) ;
Как показано в примере, описатель меню hMainMenu может быть равен NULL для отображения элементов меню команд, поскольку функция MenuHelp не использует это значение для расчета.
Простейший путь привести в соответствие элементы меню команд и строковые ресурсы состоит в том, чтобы присвоить им одинаковые значения. Это позволит установить базу строки в ноль и ее игнорировать.
Просмотр элементов всплывающего меню
В случае всплывающего меню функция MenuHelp вычисляет строку-ресурс для отображения в строке состояния путем добавления индекса (с нулевой базой) всплывающего меню к значению, на которое ссылается lpwIDs. Для того чтобы это работало правильно, необходимо, чтобы четвертый параметр функции MenuHelp — hMainMenu — имел значение описателя родительского по отношению к всплывающему меню окна. Структура, приведенная ниже, обеспечивает удобный путь для установки соответствия между описателями меню и базой строковых ресурсов:
typedef struct tagPOPUPSTRING
{
HMENU hMenu ;
UINT uiString ;
} POPUPSTRING ;
В программе GADGETS, в которой три пункта меню содержат всплывающие меню, эта структура данных определяется так:
POPUPSTRING popstr[5] ;
и инициализируется при создании строки статуса следующим образом:
HMENU hMainMenu = GetMenu (hwndParent) ;
popstr[0].hMenu = hMainMenu ;
popstr[0].uiString = IDS_MAIN_MENU ;
popstr[1].hMenu = GetSubMenu (hMainMenu, 2) ;
popstr[1].uiString = IDS_TOOLBAR_MENU ;
popstr[2].hMenu = GetSubMenu (hMainMenu, 3) ;
popstr[2].uiString = IDS_STATUSBAR_MENU ;
popstr[3].hMenu = NULL ;
popstr[3].uiString = 0 ;
При получении сообщения WM_MENUSELECT параметр lParam содержит описатель меню родительского окна. Работа функции MenuHelp по подбору правильного ресурса строки требует от вас поиска в массиве и передачи адреса, как последнего параметра функции MenuHelp. Ниже показано, как это реализуется в программе GADGETS:
if ((fuFlags & MF_POPUP) &&
(!(fuFlags & MF_SYSMENU)))
{
for (iMenu = 1 ; iMenu < MAX_MENUS ; iMenu++)
{
if ((HMENU) lParam == popstr[iMenu].hMenu)
{
hMainMenu = (HMENU) lParam ;
break ;
}
}
}
Для того чтобы это работало корректно, hMainMenu должен быть установлен в значение описателя родительского меню всплывающего меню. Пока мы рассматривали обработку своих всплывающих меню, мы совершенно забыли о системном меню.
Просмотр системного меню
Функция MenuHelp обеспечивает индикацию в строке состояния вспомогательной информации для системного меню и элементов системного меню. Все, что необходимо для этого — параметры сообщения WM_MENUSELECT wParam и lParam в том же виде, что и для других типов элементов меню. Кроме того, значение hMainMenu не должно быть равно реальному описателю системного меню; NULL — вполне подходит.
Пример
Объединим теперь все эти фрагменты для элементов меню, всплывающих меню и системного меню. Ниже приведен код, иллюстрирующий то, каким образом программа GADGETS обрабатывает сообщение WM_MENUSELECT для того, чтобы отобразить вспомогательную информацию в строке состояния:
LRESULT
Statusbar_MenuSelect (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
UINT fuFlags = (UINT) HIWORD (wParam) ;
HMENU hMainMenu = NULL ;
int iMenu = 0 ;
// Обработка несистемных всплывающих меню
if ((fuFlags & MF_POPUP) &&
(!(fuFlags & MF_SYSMENU)))
{
for (iMenu = 1 ; iMenu < MAX_MENUS ; iMenu++)
{
if ((HMENU) lParam == popstr[iMenu].hMenu)
{
hMainMenu = (HMENU) lParam ;
break ;
}
}
}
// Отображение вспомогательной информации в строке состояния
MenuHelp (WM_MENUSELECT, wParam, lParam, hMainMenu, hInst,
hwndStatusBar, &((UINT) popstr[iMenu].hMenu)) ;
return 0 ;
}