Система Windows посылает сообщения WM_COMMAND при каждом выборе пункта меню. Обычно это единственное сообщение, обрабатываемое приложением, которое может поступить от меню. При выборе пунктов системного меню вместо указанного сообщения отправляется сообщение WM_SYSCOMMAND. В приложениях может потребоваться обработка сообщений WM_INITMENU и WM_INITMENUPOPUP. Они отправляются непосредственно перед активизацией главного меню или всплывающего меню. Эти сообщения позволяют приложению изменить меню перед тем, как оно будет отображено. Сообщение WM_MENUCHAR отправляется, если пользователь предпринимает попытку использовать клавиатурную "горячую" клавишу, которая не соответствует ни одному из символов меню с предшествующим символом амперсан-да (&). Это позволяет программировать для одного пункта меню несколько клавиатурных "горячих" клавиш или может применяться для отображения сообщения об ошибке. При выборе пункта меню отправляется также сообщение WM_MENUSELECT. Оно более универсально по сравнению с сообщением WM_COMMAND, поскольку отправляется, даже если пункт меню выделен серым цветом. Обычно это сообщение устанавливает контекстную справку меню, которая может быть отображена в строке состояния программы.
Функции поддержки меню
В табл. 6.1 приведены общие сведения о функциях поддержки меню. За таблицей следует подробное описание функций.
| Таблица 6. 1. Общиесведенияофункцияхподдержкименю | |||||||||
| Функция | Назначение | ||||||||
| AppendMenu | Добавляет новый пункт к концу меню | ||||||||
| CheckMenultem | Отмечает или снимает отметку с пункта меню | ||||||||
| CheckMenuRadiottem | Отмечает одну опцию меню и очищает все другие отметки меню в диапазоне | ||||||||
| CopyAcceleraforTable | Копирует таблицы оперативных клавиш | ||||||||
| CreateAcceleratorTable | Создает таблицы оперативных клавиш | ||||||||
| CreateMenu | Создает новое, пустое меню | ||||||||
| CreatePopupMenu | Создает всплывающее меню | ||||||||
| DeleteMenu | Удаляет пункт из меню | ||||||||
| DestroyAcceleratorTable | Уничтожает таблицу оперативных клавиш | ||||||||
| DesfroyMenu | Удаляет меню из памяти | ||||||||
| DrawMenuBar | Вынуждает выполнить повторный вывод строки меню окна | ||||||||
| EnableMenuttem | Разрешает, запрещает или выделяет серым цветом пункт меню | ||||||||
| EndMenu | Завершает работу с активным меню нити | ||||||||
| GetMenu | Выбирает дескриптор меню для окна | ||||||||
| GetMenuBarlnfo | Выбирает информацию о строке меню | ||||||||
| GetMenuDefaultftem | Выбирает заданный по умолчанию пункт меню | ||||||||
| GetMenulnfo | Выбирает информацию о меню | ||||||||
| GetMenuttemCourrt | Получает данные о числе пунктов меню | ||||||||
| GetMenuttemlD | Выбирает значение идентификатора, связанное с пунктом меню | ||||||||
| GetMenultemlnfo | Выбирает информацию опункте меню | ||||||||
| GetMenuKemRect | Выбирает ограничительный прямоугольник пункта меню | ||||||||
| GetMenuState | Выбирает состояние пункта меню или число пунктов во всплывающем меню | ||||||||
| GetMenuString | Выбирает метку, показанную в пункте меню | ||||||||
| Функция | |||||||||
| GetSubMenu | Выбирает дескриптор всплывающего меню | ||||||||
| GetSystemMenu | Выбирает дескриптор системного меню | ||||||||
| HiliteMenultem | Высвечивает пункт меню верхнего уровня | ||||||||
| InsertMenultem | Добавляет новый пункт к меню | ||||||||
| IsMenu | Определяет, является ли дескриптор дескриптором меню | ||||||||
| LoadAccelerators | Загружает таблицу оперативных клавиш из файла ресурса | ||||||||
| LoadMenu | Выбирает дескриптор меню, определенного в файле ресурса | ||||||||
| LoadMenulndirect | Выбирает дескриптор меню для шаблона меню | ||||||||
| MenuttemFromPoint | Определяет пункт меню из указанной точки | ||||||||
| RemoveMenu | Удаляет пункт меню | ||||||||
| SetMenu | Присоединяет меню к окну | ||||||||
| SetMenuDefaultltem | Устанавливает заданный по умолчанию пункт для меню | ||||||||
| SetMenulnfo | Устанавливает информацию для меню | ||||||||
| SetMenultemBitmaps | Заменяет заданное по умолчанию растровое изображение отметки меню растровым изображением, определяемым пользователем | ||||||||
| SetMenuttemlnfo | Изменяет информацию для пункта меню | ||||||||
| TrackPopupMenu | Отображает подменю в любом месте экрана | ||||||||
| TrackPopupMenuEx | Отображает подменю в любом месте экрана, кроме указанной области | ||||||||
| TranslateAccelerator | Переводит комбинации клавиш в команды с использованием таблицы оперативных клавиш | ||||||||
| AppendMenu • Windows 98 • Windows 2000 | |||||||||
| Описание | Функция AppendMenu аналогична функции InsertMenultem, за исключением того, что она добавляет пункты только к концу меню. Функция InsertMenultem заменила функцию AppendMenu, поскольку последняя не поддерживает расширенных средств меню. Однако функция AppendMenu все еще может применяться для быстрого добавления пунктов к концу меню. | ||||||||
| Синтаксис | BOOL AppendMenu( HMENU hMenu, UINT uFlags, UINT idNewItem, LPCTSTR IpszNewItem ) | ||||||||
| Параметры | |||||||||
| hMenu | HMENU. Обозначает меню, к которому добавляется новый пункт. | ||||||||
| uFlags | UINT. Внешний вид и правило поведения добавляемого пункта меню. Может иметь одно или несколько значений, перечисленных в табл. 6.2. Флажки MFT_BITMAP, MFT_SEPARATOR и MFTJSTRING не могут использоваться вместе. | ||||||||
| idNewttem | UINT. Идентификатор для нового пункта меню. | ||||||||
| IpszNewItem | LPCTSTR. Содержимое нового пункта меню. Значение зависит от значения параметра uFlags. | ||||||||
| Возвращаемое значение | BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE. | ||||||||
| Таблица 6.2. ЗначенияпараметровuFlags функцииAppendMenu | |||||||||
| Значение | Описание | ||||||||
| MF_POPUP | Создает всплывающее меню. Параметр fpszNew/fem содержит дескриптор всплывающего меню. | ||||||||
| MFS_CHECKED | Помещает отметку рядом с пунктом меню. | ||||||||
| MFS_DEFAULT | Пункт меню установлен в качестве применяемого по умолчанию. Меню может содержать только один пункт меню, заданный по умолчанию, который отображается полужирным шрифтом. | ||||||||
| MFS_GRAYED | Выделяет серым цветом пункт меню и запрещает его выбор. | ||||||||
| MFS_HILITE | Высвечивает пункт меню. | ||||||||
| MFS_UNCHECKED | Этот пункт меню не имеет отметки. | ||||||||
| MFS_UNHHJTE | Этот пункт меню не высвечен. | ||||||||
| MFT_BITMAP | Отображает пункт меню с использованием растрового изображения. Параметр IpszHewltem содержит дескриптор растрового изображения. | ||||||||
| MFT_MENUBARBREAK | Помещает пункт меню на новой строке (если он находится в строке меню) или в новом столбце (если он находится во всплывающем меню). Столбцы во всплывающем меню отделяет друг от друга вертикальная линия. | ||||||||
| MFT_MENUBREAK | То же, что и MFT_MENUBARBREAK, за исключением того, что столбцы не отделяются друг от друга вертикальной линией. | ||||||||
| MFT_OWNERDRAW | Добавляет к меню пункт, выводимый владельцем. Окно принимает сообщение WM MEASUREITEM прежде, чем меню отображается впервые, и сообщение WM_DRAWITEM каждый раз, когда внешний вид пункта меню должен быть изменен. Параметр IpszNewttem содержит 32-разрядное значение, определяемое приложением. | ||||||||
| MFT_RADIOCHECK | Отображает отмеченные пункты меню с использованием отметки переключателя вместо обычной отметки — галочки. | ||||||||
| MFT_RIGHT JUSTIFY | Выравнивает вправо указанный пункт меню и все последующие пункты. Этот флажок допустим только, если пункт меню находится в строке меню. | ||||||||
| MFTJEPARATOR | Указывает, что пункт меню — разделитель. Этот флажок допустим только в том случае, когда пункт находится во всплывающем меню. | ||||||||
| MFT_STRING | Отображает пункт меню с использованием текстовой строки. Параметр IpszNewltem представляет собой указатель на строку с нулевым символом в конце. | ||||||||
| Включаемый файл | winuser.h | ||||||||
| См. также | InsertMenuItem, CreateMenu, SetMenu, DrawMenuBar | ||||||||
| Пример | В следующем примере (рис. 6.1) при выборе пункта меню Test! пункт меню New Item добавляется к концу меню и отображается на отдельной строке. | ||||||||
| См. \local-sources\chap06\06-02. txt | |||||||||
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.