Формирование и использование меню. Краткая теория, страница 2

Итак, ресурс типа меню создан. Имеется два способа подключения его к прикладной программе (директива компилятора $R в данном случае является обязательным способом включения ресурсов).

Первый способ состоит в том, что имя описания меню в ресурсе указывается при создании класса окна. Таким образом, все окна данного класса будут иметь данное меню.

Второй способ состоит в указании ссылки на меню только при создании конкретного окна. В этом случае только это окно будет иметь указанное меню.

Рассмотрим оба способа более подробно.

Указание меню при создании класса окна

Перед регистрацией класса окна ему присваивается ряд атрибутов. Имеется возможность указания меню для всех окон данного класса. Такое меню называется меню класса. Для этого наименование меню указывается в поле lpszMenuNameструктуры типа TWndClass:

WindowClass.lpszMenuName := 'MyMenu';

После того, как класс окна будет зарегистрирован, все окна данного класса будут иметь указанное меню. Меню класса можно переопределить, указав при создании окна ссылку на необходимое меню.

Указание меню для конкретного создаваемого окна

Указание меню класса при создании класса не является обязателным требованием. Каждое окно данного класса может иметь собственное меню или не иметь его совсем. Для указания меню для конкретного окна выполняются следующие действия:

1.   Ресурс типа меню загружается с помощью функции LoadMenu, возвращающей ссылку на загруженное меню.

2.  При вызове функции Create Window ссылка на это меню указывается в качестве параметра типа hMenu.

Ниже приведен пример загрузки и подключения меню с использованием функции Create Window.

Var

MyWnd:hWnd;

MyMenu:hMenu;

MyMenu := LoadMenu(hlnstance,'MyMenu');

MyWnd := CreateWindow('Wnd & Menu',

'Wnd&Menu',

ws_OverlappedWindow,

cw_UseDefault,

cw_UseDefault,

cw_UseDefault,

cw_UseDefault,

nil,

MyMenu,

hlnstance,

nil);

ObjectWindows

Подключение меню класса производится в методе TWindow.GetWindowClass. Например:

AWndClass.lpszMenuName := PChar(101);

Подключение меню при создании окна может производиться в конструкторе объекта либо в любом другом месте программы до создания окна с помощью метода Create. Это относится и к панели диалога, имеющей меню. Например, в конструкторе или методе объекта, вызываемом до создания окна, подключение меню может выглядеть так:

Attr.Menu :=LoadMenu(Hlnstance, PChar(id_Menu)); А в любом месте программы до создания окна:

MyWindow^.Attr.Menu :=LoadMenu(Hlnstance,

PChar(id_Menu));

Переменная My Window является указателем на инициализированный оконный объект.

Обработка команд меню

При выборе команды меню ядро Windows посылает сообщение wm_Commandсоответствующей оконной функции. Параметр wParamсодержит идентификатор команды меню. Оконная функция должна выполнять все действия, связаные с командой меню. Например, выбор команды Open должен сопровождаться запросом на указание имени файла, открытием файла и отображением этого файла в рабочей области окна. Все эти действия должна выполнять оконная функция.

Чаще всего обработка команд меню выполняется с помощью конструкции типа переключатель, основываясь на значении параметра wParamсообщения wm_Command:

Case Message Of

wm_Command: Begin

Case wParam Of

idm_New:;

idm_0pen :;

idm_Save : ;

idm_Close: ;

idm_Exit: ;

End; {Case wm_Command}

End;{Case Message}

Как видно из приведенного примера, идентификаторы команд меню обычно имеют префикс idm_ (идентификатор меню).

ObjectWindows

Обработка команд меню может производиться при помощи динамических виртуальных методов-обработчиков сообщений. Индекс таких методов формируется, как сумма константы cm_First и значения идентификатора меню. Методы-обработчики должны принадлежать окну-владельцу меню. Например:

Const