Меню — это, вероятно, наиболее важная часть пользовательского интерфейса, который предлагают программы для Windows, а добавление меню к вашей программе — это относительно простая задача программирования для Windows. Вы просто определяете структуру меню в вашем описании ресурсов и присваиваете каждому пункту меню уникальный идентификатор. Вы определяете имя меню в структуре класса окна. Когда пользователь выбирает пункт меню. Windows посылает вашей программе сообщение WM_COMMAND, содержащее этот идентификатор.
Строка меню выводится на экране непосредственно под строкой заголовка. Эта строка иногда называется главным меню (main menu) или меню верхнего уровня (top-level menu) программы. Выбор элемента главного меню обычно приводит к вызову другого меню, появляющегося под главным, и которое обычно называют всплывающим меню (popup menu) или подменю (submenu). Вы также можете определить несколько уровней вложенности всплывающих меню: т. е. определенный пункт всплывающего меню может вызвать появление другого всплывающего меню. Иногда, с целью увеличения информативности, вызов каких-то пунктов меню приводит к появлению окон диалога. (Об окнах диалога рассказывается в следующей главе.) В большинстве родительских окон, в левой части строки заголовка, имеется маленький значок программы. Щелчок на этом значке приводит к появлению системного меню, которое фактически является всплывающим меню другого типа.
Пункты всплывающих меню могут быть помечены (checked), при этом слева от текста элемента меню Windows ставится специальная метка или "галочка". Галочки позволяют пользователю узнать о том, какие опции программы выбраны из этого меню. Эти опции могут быть взаимоисключающими. Пункты главного меню помечены быть не могут.
Пункты меню в главном и всплывающих меню могут быть "разрешены" (enabled), "запрещены" (disabled) или "недоступны" (grayed). Слова "активно" (active) и "неактивно" (inactive) иногда используются, как синонимы слов "разрешено" и "запрещено". Пункты меню, помеченные как разрешенные или запрещенные, для пользователя выглядят одинаково, а недоступный пункт меню выводится на экран в сером цвете.
С точки зрения пользователя все пункты меню, разрешенные, запрещенные и недоступные, могут быть выбраны. (Отличие только в том, что при выборе запрещенных или недоступных пунктов меню с приложением ничего не происходит.) Пользователь может щелкнуть клавишей мыши на запрещенном пункте меню, или переместить к запрещенному пункту меню подсветку, или переключиться на пункт меню с помощью буквенной клавиши, соответствующей этому пункту. Однако, с позиции вашей программы разрешенные, запрещенные и недоступные пункты меню функционируют по-разному. Сообщения WM_COMMAND Windows посылает в программу только для разрешенных пунктов меню. Используйте запрещенные и недоступные пункты меню только для тех опций, которые в данный момент не могут быть выбраны. Для того чтобы пользователь знал, какие опции не могут быть выполнены, делайте их недоступными.
Структура меню
Если вы создаете или изменяете меню программы, полезно разделять главное меню и все всплывающие меню. У главного меню имеется описатель меню, у каждого всплывающего меню внутри главного меню имеется собственный описатель меню, и у системного меню (тоже являющегося всплывающим меню) тоже имеется описатель меню.
Каждый пункт меню определяется тремя характеристиками. Первая характеристика определяет то, что будет отображено в меню. Это либо строка текста, либо битовый образ. Вторая характеристика определяет либо идентификатор, который Windows посылает вашей программе в сообщении WM_COMMAND, либо всплывающее меню, которое Windows выводит на экран, когда пользователь выбирает данный пункт меню. Третья характеристика описывает атрибут пункта меню, включая то, является ли данный пункт запрещенным, недоступным или помеченным.
Шаблон меню
Меню можно создать тремя разными способами. Наиболее обычным (и самым простым) является определение меню в файле описания ресурсов, для чего можно использовать редактор ресурсов, прилагаемый к современным пакетам программирования, либо непосредственно в текстовом виде в форме шаблона меню, например:
MyMenu MENU
{ [список элементов меню]
}
MyMenu — это имя меню. Вы ссылаетесь на это имя в структуре класса окна. Обычно имя меню такое же, как имя приложения. Внутри квадратных скобок можно использовать либо инструкцию MENUITEM, либо POPUP. Инструкция MENUITEM имеет следующий формат:
MENUITEM "SText", id [, признаки]
Формат инструкции POPUP:
POPUP "SText" [, признаки]
{
[список элементов меню]
}
Вместо фигурных скобок можно использовать ключевые слова BEGIN и END. Текст, выводимый для каждого пункта меню должен быть заключен в парные кавычки. Амперсант (&) вызывает подчеркивание следующего за ним символа при выводе на экран. Windows ищет этот же символ, когда пользователь выбирает элемент меню с использованием клавиши <Alt>. Если не включить амперсант в текст, то в тексте меню не будет подчеркнутых символов, и Windows будет использовать первую букву текста при поиске.
Признаками в операторах MENUITEM и POPUP, которые появляются в списке главного меню, являются следующие:
• GRAYED — Данный пункт меню недоступен и не генерирует сообщений WM_COMMAND. Текст изображается недоступным (серым цветом).
• INACTIVE — Данный пункт меню неактивен и не генерирует сообщений WM_COMMAND. Текст изображается обычным образом.
• MENUBREAK — Данный пункт меню, а также все последующие появляются на экране в новой строке меню.
• HELP — Данный пункт меню, а также все последующие появляются на экране, выровненными по правому краю.
Признаки могут комбинироваться с помощью символа поразрядной операции OR языка С (|), но опции GRAYED и INACTIVE нельзя использовать вместе. Опция MENUBREAK не используется в главном меню, поскольку Windows автоматически создает новую строку главного меню, если окно слишком узкое для размещения всех пунктов меню в одну строку.
Следующие за инструкцией POPUP в главном меню квадратные скобки (или ключевые слова BEGIN и END) ограничивают список пунктов всплывающего меню. При определении всплывающего меню допускаются следующие инструкции:
MENUITEM "text", id [, признаки] а также: