Любой, кто хоть немного работал в Windows, знает, что меню располагаются сразу под заголовком окна и позволяют пользователю осуществить выбор возможностей, предоставляемых программой. Помимо этого, существуют также всплывающие меню, которые могут появлятся в любой точке экрана. Обычно их содержание зависит от того, на каком окне щелкнули клавишей мыши.
Давайте представим себе главное меню программы как древовидную структуру. Основная часть - корень нашего дерева - это непосредственно главное меню. Само по себе оно представляет только структуру в памяти, не отображается на экране, не содержит ни одного элемента, но хранит указатель на список структур, описывающих подключаемые к нему элементы и всплывающие (popup) меню. В свою очередь, popup-меню должно указать на список структур очередного, более низкого уровня и т.д. Конечные элементы меню никаких указателей на списки не имеют, но хранят некий идентификатор действия (назовем его идентификатором элемента меню), которое должна произвести программа при выборе данного элемента меню. Используя эти структуры, мы можем построить меню практически любой глубины и сложности.
Эта многоуровневая древовидная структура описывается в файле ресурсов. Описание меню имеет вид:
MenuName MENU [параметры] ; это - главное меню { Описание всех popup-меню и элементов меню второго уровня }В данном случае MenuName - это имя создаваемого нами меню. Слово MENU обозначает начало определения меню.
В Win32 API для описания меню существуют два ключевых слова. Первое - POPUP - специфицирует всплывающее меню. Второе - MENUITEM - описывает обычный элемент меню.
Всплывающие меню описывается следующим образом:
POPUP "Имя" [,параметры] ; описание popup-меню { Описание всех popup-меню и элементов очередного уровня }У конечного элемента меню в его описании есть еще одна характеристика - тот самый идентификатор действия:
MENUITEM "Имя", MenuID [,параметры]В обоих случаях "Имя" - это тот текст, который будет выведен на экран при отображении меню (обратите внимание - при описании главного меню выводимого на экран текста нет!). В том случае, когда вместо имени окна записано слово SEPARATOP (без кавычек!), на месте элемента меню появляется горизонтальная линия. Обычно эти горизонтальные линии (сепораторы или разделители) используются для разделения элементов подменю на логические группы (логика определяется только программистом и никаких особенностей не содержит).
Если в имени меню встречается символ "&", то следующий за амперсандом символ на экране будет подчеркнут одинарной чертой. Этот элемент меню можно будет вызывать с клавиатуры посредством одновременного нажатия клавиши Alt и подчеркнутого символа.
MenuID - идентификатор действия. Он может быть передан функции окна, содержащего меню. Значение идентификатора определяется пользователем. Функция окна в зависимости от полученного MenuID производит определенные действия.
Параметры же описывают способ появления элемента на экране. Возможные значения параметров приведены в таблице:
Флаг | Значение |
CHECKED | Рядом с именем элемента может отображаться небольшой значек, говорящий о том, что соответствующий флаг установлен |
ENABLED | Элемент меню доступен |
DISABLED | Элемент меню недоступен, но отображается как обычный |
GRAYED | Элемент меню недоступен и отображается серым цветом |
MENUBREAK | Горизонтальные меню размещают следующие элементы в новой строке, а вертикальные - в новом столбце |
MENUBARBREAK | То же, что и предыдущее, но в случае вертикального меню столбцы разделяются вертикальной линией |
Попробуем создать описание небольшого меню. Горизонтальное меню (menubar) позволит выбирать подменю "File", "Examples" и конечный элемент "Help". Подменю "File" будет содержать элементы "Open" и "Exit", разделенные горизонтальной линией, а подменю "Examples" - несколько конечных элементов.
Ниже приведен текст скрипта для этого меню:
MyMenu MENU { POPUP "&File" { MENUITEM "&Open", 101 MENUITEM SEPARATOR MENUITEM "E&xit", 102 } POPUP "&Examples" { POPUP "Example 1" { MENUITEM "1&1", 103 MENUITEM "1&2", 104 } POPUP "Example 2" { MENUITEM "2&1", 105 MENUITEM "2&2", 106 } } MENUITEM "&Help", 111 }Следует обратить внимание на то, что идентификаторы действия есть только у MENUITEM'ов. Popup-меню идентификаторов не содержит.