Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-12_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
456.7 Кб
Скачать

Просмотр элементов меню

Функция 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. Для того чтобы это работало правильно, необходимо, чтобы четвертый параметр функции MenuHelphMainMenu — имел значение описателя родительского по отношению к всплывающему меню окна. Структура, приведенная ниже, обеспечивает удобный путь для установки соответствия между описателями меню и базой строковых ресурсов:

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 ;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]