}
break;

Функция GetMenuState() возвращает переменную f 1 ag, в которой устанавливаются биты, заданные константами MFJNABLED, MF_CHECKED, MFJISABLED, MF_HILITE, в соответствии с текущим состоянием пункта меню. Флаг MF JYP0SITI0N (или MF_BYCOMMAND) в третьем параметре определяет трактовку второго параметра как номера пункта в подменю или как закрепленного за пунктом в шаблоне меню идентификатора. В данном случае число 1 указывает, что проверяется состояние второго пункта подменю. Указанные константы являются битовыми флагами, поэтому могут объединяться с другими флагами. Но нельзя объединять вместе константы MF JYCOMMAND и MF_BYP0SITI0N, потому что они задают альтернативные способы интерпретации второго параметра.

Вызовы функции EnableMenuItem() в приведенном фрагменте изменяют состояние пункта меню. Первый параметр задает дескриптор подменю, а второй - номер пункта в подменю. В третьем параметре для задания состояния пункта добавлены флаги MFJNABLED и MF_DISABLED.

Можно попробовать в рассмотренном примере реализовать оператор if… else двумя операциями, как показано далее:

if(flag &MF_GRAYED)
EnableMenuItem(menl. 1.MF JYPOSITION |MFJNABLED);

Взаимодействие меню и приложения

if (flag & MFJNABLED)
EnableMenuItem(menl,1.MF_BYPOSITION|MF_GRAYED);

Но в этом случае программа перестанет работать. Причина заключается в том, что в файле Winuser.h неудачно заданы константы флагов:

#define MFJNABLED OxOOOOOOOOL #define MF_GRAYED OxOOOOOOOlL #define MF_UNCHECKED OxOOOOOOOOL.

Поскольку флаги MFJNABLED и MFJJNCHECKED равны нулю, их наличие нельзя проверять операцией типа if (Л ад & MFJNABLED).

Для снятия и установки отметки возле пункта меню используют функцию CheckMenuItem(). Пример ее использования приведен в листинге 5.7.

Листинг 5.7

case WM_RBUTTONUP: {
HMENU menu - GetMenu(hWnd):
if(GetMenuState(menu. IMPORT. MFJYCOMMAND) & MFJHECKED)
CheckMenuItem(menu. IMPORT.MFJYCOMMAND | MFJNCHECKED); else
CheckMenuItem(menu. IMPORT.MFJYCOMMAND | MFJHECKED):
}

В этом примере флаг MFJYCOMMAND указывает, что терминальный пункт задается не позицией в подменю File, а командой IMPORT. Поскольку идентификаторы всех пунктов различны, можно не запрашивать дескриптор подменю. Дескриптор основного меню menu указан в первом параметре.


⇐ Предыдущая| |Следующая ⇒