Независимые всплывающие меню
Вы также можете создать меню без строки главного меню. Вместо нее можно создать всплывающее меню, которое будет появляться в любой части экрана. Один из подходов состоит в том, что всплывающее меню должно появляться при щелчке правой кнопки мыши. Однако, сами пункты меню по-прежнему должны выбираться левой кнопкой мыши.
В файле описания ресурсов меню определяется почти так, как ранее . Отличие состоит только в том, что главное меню содержит только один пункт — всплывающее меню, содержащее опции File, Edit, Background и Help.
hMenu = LoadMenu (hinst, szAppName) ;
hMenu = GetSubMenu (hMenu, 0) ;
При обработке сообщения WM_RBUTTONDOWN, программа получает положение указателя мыши, преобразует это положение в координаты экрана и передает их функции TrackPopupMenu:
point.x = LOWORD (IParam) ;
point. у = HIWORD (IParam) ;
ClientToScreen (hwnd, Spoint) ;
TrackPopupMenu (hMenu, 0, point.x, point.y, 0, hwnd, NULL) ;
Затем Windows выводит на экран всплывающее меню с пунктами File, Edit, Background и Help. Выбор любого из этих пунктов приводит к тому, что вложенное всплывающее окно меню появляется на экране правее выбранной опции. Функции этого меню те же, что и у обычного меню.
Изменение меню
Мы уже видели, как функция AppendMenu может использоваться для определения меню в целом внутри программы и добавления пунктов к системному меню. До появления Windows 3.0 для выполнения этой работы использовалась функция ChangeMenu. Функция ChangeMenu была столь многогранной по своим задачам, что была одной из наиболее сложных функций в Windows. В Windows 95 эта функция по-прежнему имеется, но ее задачи распределены между пятью новыми функциями:
· AppendMenu — добавляет новый элемент в конец меню.
· DeleteMenu — удаляет существующий пункт меню и уничтожает его.
· InsertMenu — вставляет в меню новый пункт.
· ModifyMenu — изменяет существующий пункт меню.
· RemoveMenu — удаляет существующий пункт меню.
Отличие между функциями DeleteMenu и RemoveMenu весьма важно, если указанный пункт меню является всплывающим меню. Функция DeleteMenu уничтожает всплывающее меню, а функция RemoveMenu — нет.
Другие команды меню
Для работы с меню имеется еще несколько полезных функций.
Если изменяется пункт главного меню, изменения не произойдет, пока Windows не перерисует строку меню. Вызвав функцию DrawMenuBar, можно форсировать эту операцию:
DrawMenuBar (hwnd) ;
Описатель всплывающего меню можно получить с помощью функции GetSubMenu:
hMenuPopup = GetSubMenu (hMenu, iPosition) ;
– 61 –
где iPosition — это индекс (отсчитываемый с 0) всплывающего меню внутри главного меню, которое задается параметром hMenu. Затем, полученный описатель всплывающего меню hMenuPopup можно использовать в других функциях, например, AppendMenu.
Текущее число пунктов главного или всплывающего меню можно получить с помощью функции GetMenuItemCount:
iCount = GetMenuItemCount (hMenu) ;
Идентификатор меню для пункта всплывающего меню можно получить следующим образом:
id = GetMenuItemID (hMenuPopup, iPosition) ;
Установить или удалить метку пункта всплывающего меню с помощью функции
CheckMenuItem (hMenu, id, iCheck) ;
hMenu - описатель главного меню, id — идентификатором меню, а значение параметра iCheck равно либо MF_CHECKED, либо MF_UNCHECKED. Если hMenu является описателем всплывающего меню, то параметр id может стать не идентификатором меню, а индексом положения. Если пользоваться этим индексом удобнее, то в третьем параметре указывается флаг MF_BYPOSITION. Например:
CheckMenuItem (hMenu, iPosition, MF_CHECKED I MF_BYPOSITION) ;
Работа функции EnableMenuItem похожа на работу функции CheckMenuItem за исключением того, что третьим параметром может быть MF_JENABLED, MF_DISABLED или MF_GRAYED.
EnableMenuItem ((HMENU) wParam, IDM_PASTE, MF_ENABLED) ;
Если используется функция EnableMenuItem для пункта главного меню, содержащего всплывающее меню, то в качестве третьего параметра следует использовать идентификатор MF_BYPOSITION, поскольку этот пункт меню не имеет идентификатора меню.
Функция HiliteMenuItem напоминает функции CheckMenuItem и EnableMenuItem, но использует идентификаторы MF_HILITE и MF_UNHILITE. Эта функция обеспечивает инверсное изображение, которое Windows использует, когда вы перемещаете указатель от одного из пунктов меню к другому. Обычным приложениям нет необходимости использовать функцию HiliteMenuItem.
Что еще нужно сделать с меню? Если вы забыли, какие символьные строки использовались в вашем меню, то освежить память можно следующим образом:
iByteCount = GetMenuString (hMenu, id, pString, i Max Count, iFlag) ;
Параметр iFlag равен либо MF_BYCOMMAND (при этом id — это идентификатор меню), либо MF_JBYPOSITION (при этом id — это индекс положения). Функция копирует i Max Count байтов строки символов в pString и возвращает число скопированных байтов.
Может быть, вы хотите узнать, каковы текущие флаги пункта меню:
iFlags = GetMenuState (hMenu, id, iFlag) ;
И снова, параметр iFlag равен либо MF _ BYCOMMAND , либо MF _ BYPOSITION . Возвращаемое значение функции iFlags — это комбинация всех текущих флагов. Вы можете определить текущие флаги, проверив iFlags с помощью идентификаторов MF _ DISABLED , MF _ GRAYED , MF _ CHECKED , MF _ MENUBREAK , MF _ MENUBARBREAK и MF _ SEPARATOR .
А может быть, вам уже слегка надоело меню. В таком случае, если меню вам больше не нужно, его можно удалить:
DestroyMenu ( hMenu ) ;
Эта функция делает недействительным описатель меню.
Быстрые клавиши
Дата добавления: 2016-11-22; просмотров: 651;