Работа с меню в Windows – одно из самых простых и понятных мест. Для создания меню вам просто нужно:
1) Задать структуру меню в файле ресурсов, последовательно определив пункты меню в виде текстовых строк.
2) Каждому пункту меню поставить в соответствие уникальный идентификатор.
3) Указать имя меню в структуре класса окна.
Как вы уже понимаете, для функции окна неважно, каким образом пользователь выбрал команду – при помощи последовательно нажатий клавиш (Alt, стрелка вправо, ... , Enter, стрелка вниз, ... , Enter), мышью или просто нажатием назначенных на пункт меню комбинацией клавиш (например, копируете текст в «почтовый ящик» – Clipboard – нажатием Ctrl / Ins ).
Когда пользователь выбирает пункт меню, Windows передает приложению сообщение WM_COMMAND, содержащее идентификатор выбранного пункта, так что после определения структуры меню в файле ресурсов нужно оформить собственно текст программы – вывести обработку сообщения WM_COMMAND.
Меню главного окна размещается непосредственно под заголовком окна; это старший уровень меню приложения, поэтому его иногда называют главным меню. Пункты главных меню могут является заголовками «падающих» меню, которые, в свою очередь, могут быть заголовками «всплывающих» меню. Пункты меню верхнего уровня могут быть активные, неактивные, отмеченными или отображается серым цветом.
Отображение серым цветом и неактивность меню – разные вещи; пункт может отображаться нормально, но быть неактивным (DESABLED). Однако, если пункт отображается серым цветом (GRAYED), то он всегда неактивен; мы рекомендуем вам пользоваться именно этим состоянием, поскольку иначе пользователь не может определить активен пункт или нет.
Меню может быть создано двумя различными способами: описанием в файле ресурсов и функциями динамической работы с меню, т.е. непосредственно из самой программы, в процессе её работы. Чаще всего используются оба способа: при создании программы в файле ресурсов определяется одно или несколько меню, а в процессе работы по мере необходимости одно меню может быть заменено другим или изменены некоторые свойства текущего меню (пункты могут быть динамически добавлены, убраны, отмечены, выделены серым цветом и т.п.).
Определение меню приложения, включенное в файл ресурсов, может быть создано как вручную, так и при помощи редактора меню, входящего в состав редактора ресурсов.
Определение меню, которое помещается в файл ресурсов, должно иметь следующий формат:
MenuName MENU [опции загрузки] [опции памяти]
begin
MENUITEM «Item1», IDM_Item1
MENUITEM «Item2», IDM_Item2
...
POPUP «Item3»
begin
MENUITEM «Item3–1», IDM_Item3–1
MENUITEM «Item3–2», IDM_Item3–2
...
POPUP «Item3–6»
begin
MENUITEM «Item3–6–1», IDM_Item3–6–1
MENUITEM «Item3–6–2», IDM_Item3–6–2
...
end
...
end
...
end
Здесь MenuName – это имя ресурса–меню, подобно имени ресурсов–пиктограмм или ресурсов–курсоров, рассмотренных ранее. По этому имени можно обращаться к описанию меню из программы. Опции загрузки – PRELOAD или LOADNCALL – указывают, как следует поступить с ресурсом при загрузке приложения на выполнение. Если указать PRELOAD, то ресурс меню загружается при загрузке приложения автоматически, а при использовании ключа LOADNCALL ресурс меню загружается в память только по необходимости.
Опции памяти – FIXED, MOVEABLE и DISCARDABLE – управляют тем, как Windows должен «обращаться» с сегментом памяти, в который загружается ресурс, в процессе работы приложения. Опции FIXED запрещает Windows перемещать сегмент с ресурсом в памяти, опция MOEABLE явно разрешает перемещение сегмента при необходимости (но при этом сегмент считается неснимаемым), а опция DISCARDABLE указывает Windows, что он может удалять сегмент с ресурсом (меню) из памяти (сигмент с описанием ресурсов считается снимаемым). По умолчанию действуют опции MOVEABLE и DISCARDABLE. Если явно указывается опция DISCARDABLE, надо также указать MOVEABLE.
Пункты меню определяются между ключевыми словами BEGIN и END. Они могут быть двух типов – описанные ключевыми словами MENUITEM и POPUP. Пункт, описанный ключевым словом MENUITEM, является конечным пунктом меню; выбор этого пункта пользователем влечет за собой не переход на более низкий уровень меню, а передачу функции окна сообщения WM_COMMAND, в параметр wParam которого помещен идентификатор wID.
MENUITEM «&Пункт», wID ,опции
Всем пунктам меню можно назначать опции, определяющие свойства пунктов меню при начальной згрузке (в последствии эти свойства могут быть изменены):
GRAYED
Пункт меню неактивный (не вырабатывает сообщений WM_COMMAND при выборе его пользователем). Текст пункта отображается на экране в сером цвете.
INACTIVE
Пункт меню неактивный (не вырабатывает сообщений WM_COMMAND при выборе его пользователем). Отображает он, однако, так же, как и активный.
NENUBREAK
Это и следущие за ним пункты меню отображаются в новом столбце(если указан для главного меню, то в новой строке).
MENUBARBREAK
Это и следущие за ним пункты меню отображаются в новом столбце(если указан для главного меню, то в новой строке); предидущий и новый столбец (строка) разделяются вертикальной чертой.
CHECKED
Пункт меню помечен галочкой, помещенной слева от него. Этот флаг не используется для пунктов главного меню приложения.
SEPARATOR
Это ключевое слово указывается без пункта меню, поскольку определяет разделитель (горизонтальную линию), которым выделяются в группы связанные пункты меню.
HELP
пункт меню выравнивается по правой стороне меню.
Опции, перечисленные выше, могут комбинироваться при описании меню с помощью булевой операции «ИЛИ» (символ ч ); нельзя только комбинировать опции GRAYED и INACTIVE, а также опции MENUBREAK и MENUBARBREAK.
Величина wID в предложении MENUITEM определяет число, которое Windows передает приложению через сообщение WM_COMMAND от меню. Идентификатор пункта меню wID должен быть уникальным; идентификаторы, как правило, определяются отдельно, в специальном включающем файле.
Пункт, описанный ключевым словом POPUP, является заголовком подменю; при выборе этого пункта пользователем сообщение WM_COMMAND функции окна не передается (и поэтому здесь идентификатор wID не нужен), а открывается подменю, пункты которого также описаны ключевыми словами BEGIN и END:
POPUP «&Пункт», опции
BEGIN
...
END
Для пунктов, описанных ключевым словом POPUP, можно использовать те же опции, что и для пунктов MENUITEM.
Та буква в названии меню, перед которой указан символ амперсанта (&), при выводе меню автоматически выделяется подчеркиванием, и ее нажатие (вместе с клавишей Alt) приводит к выбору данного пункта. Если не включать в наименование пункта значок амперсанта, то Windows не будет подчеркивать символы текста, а с клавишей Alt можно будет использовать первый символ текста.