Учебное пособие: Подклассы окон
Еще одна разновидность ресурсов, которую мы должны сейчас рассмотреть – меню. Меню, предоставляемое Windows имеет иерархическую организацию. Основное меню всегда представлено строкой в верхней части окна, из него могут “выпадать” вертикальные меню, связанные с конкретным пунктом, и так далее - причем все уровни меню, кроме верхнего, представлены вертикальными меню.
Меню может быть описано как с помощью ресурсов, так и программно, причем существующее меню всегда может быть изменено. При работе с меню наше приложение будет получать следующие сообщения:
WM_ENTERMENUIDLE когда меню было активизировано и находится в состоянии ожидания.
WM_MENUSELECT посылается окну, использующему меню, как извещение о выборе пункта меню.
WM_MENUCHAR информирует окно о том, что при работе с меню была нажата кнопка не соответствующая никакому пункту меню. Обрабатывая это сообщение Вы можете вернуть номер пункта меню который надо выбрать, указать Windows о том, что работа с меню закончена или потребовать короткий звуковой сигнал.
WM_COMMAND посылается окну, извещая его о выборе требуемого пункта меню. Параметр wPar содержит идентификатор пункта меню, а lPar равен 0L. Обычно при работе с меню обрабатывается только сообщение WM_COMMAND, остальные применяются в специальных случаях.
Сейчас мы можем подвести некоторый итог под применением сообщения WM_COMMAND, которое может быть получено от дочернего окна, акселератора или меню:
wPar | LOWORD(lPar) | HIWORD(lPar) | |
окно | Id | hWndChild | wCode |
акселератор | Id | 0 | 1 |
меню | Id | 0 | 0 |
При работе с системным меню вместо сообщения WM_COMMAND мы будем получать сообщения WM_SYSCOMMAND. При описании меню в ресурсе текст описания меню должен размещаться в файле описания ресурсов в следующей форме:
MenuName MENU [load-opt] [mem-opt]
BEGIN
определения пунктов меню 0-го уровня:
MENUITEM для определения пункта
POPUP для определения пункта, связанного с меню следующего уровня
BEGIN
определение пунктов меню 1-го уровня
...
END
END
Для определения пункта меню, связанного с меню следующего уровня мы должны использовать следующую форму записи:
POPUP text [, options]
BEGIN
...
END
Для задания обычного пункта меню, то есть посылающего WM_COMMAND при его выборе, мы должны использовать следующую форму записи:
MENUITEM text, id [, options]
В этих случаях приняты следующие обозначения:
text задает текст пункта меню в виде строки взятой в двойные кавычки, один из символов строки может предваряться символом &, который приводит к подчеркиванию этого символа и его автоматической интерпретации как акселератора.
id определяет идентификатор пункта меню
options указывает на некоторые возможные характеристики данного пункта меню: