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

Изменение меню

Мы уже видели, как функция AppendMenu может использоваться для определения меню в целом внутри программы и добавления пунктов к системному меню. До появления Windows 3.0 для выполнения этой работы использовалась функция ChangeMenu. Функция ChangeMenu была столь многогранной по своим задачам, что была одной из наиболее сложных функций в Windows. В Windows 95 эта функция по-прежнему имеется, но ее задачи распределены между пятью новыми функциями:

  • AppendMenu — добавляет новый элемент в конец меню.

  • DeleteMenu — удаляет существующий пункт меню и уничтожает его.

  • InsertMenu — вставляет в меню новый пункт.

  • ModifyMenu — изменяет существующий пункт меню.

  • RemoveMenu — удаляет существующий пункт меню.

Отличие между функциями DeleteMenu и RemoveMenu весьма важно, если указанный пункт меню является всплывающим меню. Функция DeleteMenu уничтожает всплывающее меню, а функция RemoveMenu — нет.

Другие команды меню

Для работы с меню имеется еще несколько полезных функций.

Если изменяется пункт главного меню, изменения не произойдет, пока Windows не перерисует строку меню. Вызвав функцию DrawMenuBar, можно форсировать эту операцию:

DrawMenuBar (hwnd) ;

Обратите внимание, что параметром функции DrawMenuBar является описатель окна, а не описатель меню.

Описатель всплывающего меню можно получить с помощью функции GetSubMenu:

hMenuPopup = GetSubMenu (hMenu, iPosition) ;

где iPosition — это индекс (отсчитываемый с 0) всплывающего меню внутри главного меню, которое задается параметром hMenu. Затем, полученный описатель всплывающего меню hMenuPopup можно использовать в других функциях, например, AppendMenu.

Текущее число пунктов главного или всплывающего меню можно получить с помощью функции GetMenuItemCount :

iCount = GetMenuItemCount (hMenu) ;

Идентификатор меню для пункта всплывающего меню можно получить следующим образом:

id = GetMenuItemID (hMenuPopup, iPosition) ;

В программе MENUDEMO было показано, как установить или удалить метку пункта всплывающего меню с помощью функции CheckMenuItem :

CheckMenuItem (hMenu, id, iCheck) ;

В программе MENUDEMO hMenu был описателем главного меню, id — идентификатором меню, а значение параметра iCheck было равно либо MF_CHECKED, либо MF_UNCHECKED. Если hMenu является описателем всплывающего меню, то параметр id может стать не идентификатором меню, а индексом положения. Если пользоваться этим индексом удобнее, то в третьем параметре указывается флаг MF_BYPOSITION. Например:

CheckMenuItem (hMenu, iPosition, MF_CHECKED | MF_BYPOSITION) ;

Работа функции EnableMenuItem похожа на работу функции CheckMenuItem за исключением того, что третьим параметром может быть MF_ENABLED, MF_DISABLED или MF_GRAYED. Если используется функция EnableMenuItem для пункта главного меню, содержащего всплывающее меню, то в качестве третьего параметра следует использовать идентификатор MF_BYPOSITION, поскольку этот пункт меню не имеет идентификатора меню. Мы рассмотрим пример использования функции EnableMenuItem в программе POPPAD, представленной далее в этой главе. Функция HiliteMenuItem напоминает функции CheckMenuItem и EnableMenuItem, но использует идентификаторы MF_HILITE и MF_UNHILITE. Эта функция обеспечивает инверсное изображение, которое Windows использует, когда вы перемещаете указатель от одного из пунктов меню к другому. Обычным приложениям нет необходимости использовать функцию HiliteMenuItem.

Что еще нужно сделать с меню? Если вы забыли, какие символьные строки использовались в вашем меню, то освежить память можно следующим образом:

iByteCount = GetMenuString (hMenu, id, pString, iMaxCount, iFlag) ;

Параметр iFlag равен либо MF_BYCOMMAND (при этом id — это идентификатор меню), либо MF_BYPOSITION (при этом id — это индекс положения). Функция копирует iMaxCount байтов строки символов в 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) ;

Эта функция делает недействительным описатель меню.

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