Подготовка шаблона меню
Проще всего создать меню на базе шаблона, записанного в файле описания ресурсов приложения. Такой шаблон имеет следующий вид:
MENU MenuID BEGIN ... END
В качестве MenuID вы должны указать идентификатор меню. Если вы создаете меню верхнего уровня, идентификатором меню должен служить идентификатор ресурсов, указанный при создании главного окна функцией WinCreateStdWindow .
Между строками BEGIN и END (которые, кстати, можно заменить скобками { и }, соответственно) располагаются операторы описания временных меню SUBMENU и операторы описания отдельных строк меню MENUITEM .
Для примера приведем сокращенный образец шаблона меню, взятый из приложения MENUAPP, исходные тексты которого будут приведены в этой главе:
MENU ID_APP_FRAMEWND BEGIN SUBMENU "~File", IDM_FILE BEGIN MENUITEM "~New...", IDM_FILE_NEW MENUITEM "~Open...", IDM_FILE_OPEN MENUITEM SEPARATOR MENUITEM "~Save...", IDM_FILE_SAVE MENUITEM "Save ~as...", IDM_FILE_SAVEAS MENUITEM SEPARATOR MENUITEM "~Exit", IDM_FILE_EXIT END
SUBMENU "~Help", IDM_HELP BEGIN MENUITEM "Help ~index...", IDM_HELP_INDEX MENUITEM "~General help...", IDM_HELP_GENERAL MENUITEM "~Using help...", IDM_HELP_USING MENUITEM "~Keys help...", IDM_HELP_KEYS MENUITEM SEPARATOR MENUITEM "~Product information...",IDM_HELP_ABOUT END END
В этом шаблоне описано меню с идентификатором ID_APP_FRAMEWND. Этот идентификатор был использован при создании главного окна приложения.
В меню с помощью операторов SUBMENU определено два временных меню: File и Help.
Каждое временное меню имеет свой идентификатор, указанный в операторе SUBMENU. Описание каждого временного меню ограничено операторами BEGIN и END.
Общий вид оператора SUBMENU представлен ниже:
SUBMENU text, id
В поле text должна располагаться строка, которая будет отображаться в меню верхнего уровня. Эта строка должна быть заключена в кавычки.
Если в строке имеется символ ~, следующий за ним символ изображается подчеркнутым и используется для ускоренного выбора в комбинации с клавишей <Alt>.
В качестве идентификатора вы можете использовать целое число или символические константы, не совпадающие с идентификаторами других меню или строк меню.
Оператор описания строк меню имеет следующий вид:
MENUITEM text, id, style, attribute
Поле text определяет текстовую строку, которая будет отображаться в строке меню. Для обеспечения ускоренного доступа к строке меню вы можете выделить один из символов строки подчеркиванием, указав перед ним символ ~.
Идентификатор id должен быть указан как целое число или символическая константа.
В качестве значения для поля style, определяющего стиль строки меню, вы можете использовать одну из следующих констант:
Константа | Описание |
MIS_SUBMENU | Данная строка является меню следующего уровня |
MIS_SEPARATOR | Горизонтальная разделительная линия |
MIS_BITMAP | В строке меню отображается не текст, а графическое изображение |
MIS_TEXT | В строке меню отображается текстовая строка. Этот стиль используется по умолчанию |
MIS_BUTTONSEPARATOR | Разделитель меню |
MIS_BREAK | Начало нового столбца или строки меню |
MIS_BREAKSEPARATOR | Аналогично MIS_BREAK, однако дополнительно отображается разделитель. Этот стиль используется только для вложенных меню |
MIS_SYSCOMMAND | Если указан этот стиль, то при выборе пользователем строки из меню в родительское окно вместо сообщения с кодом WM_COMMAND передается сообщение с кодом WM_SYSCOMMAND |
MIS_OWNERDRAW | При использовании этого стиля родительское окно рисует строку меню самостоятельно. Для того чтобы функция родительского окна имела возможность определить видимые границы, занимаемые строкой, ей передается сообщение WM_MEASUREITEM . Рисование выполняется при получении родительским окном сообщения WM_DRAWITEM |
MIS_HELP | При выборе строки меню родительское окно вместо сообщения с кодом WM_COMMAND получает сообщение с кодом WM_HELP |
MIS_STATIC | Строка с таким стилем не может быть выбрана ни с помощью мыши, ни с помощью клавиатуры |
Значение | Описание |
MIA_HILITED | Этот атрибут устанавливается если пользователь выделил соответствующую строку меню |
MIA_CHECKED | Выделение строки символом "галочки" |
MIA_DISABLED | Строка заблокирована и не может быть выбрана |
MIA_FRAMED | Вокруг строки отображается рамка |
MIA_NODISMISS | Если указан этот атрибут, то сответстсвующее временное меню не исчезнет с экрана до тех пор, пока родительское окно не получит извещение о выборе строки, или пока пользователь не перейдет к работе с другим меню, или пока он не нажмет клавишу <Esc> |