Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции -Процедурное программирование в Windows.doc
Скачиваний:
13
Добавлен:
13.09.2019
Размер:
742.91 Кб
Скачать

Создание описания меню в файле ресурсов

Определение меню приложения, включенное в файл ресурсов, может быть создано как вручную, так и при помощи редактора меню, входящего в состав редактора ресурсов.

Определение меню, которое помещается в файл ресурсов, должно иметь следующий формат:

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 можно будет использовать первый символ текста.

Использование меню

Создание описания меню, нужно указать имя меню в структуре класса окна; тогда указанное вами меню будет загружаться, отображаться и обслуживаться Windows автоматически:

W. lpszMenuName = "menu";

Другой («динамический») способ работы с меню в приложении заключается в том, что вы загружаете меню в память, вызывая функцию LoadMenu:

W.lpszMenuName = LoadMenu (hInstance, "menu");

Функция LoadMenu() возвращает дескриптор меню, который используется при всех обращениях к меню стандартными функциями Windows – в частности, указывается девятым параметром вызова функции CreateWindow():

hWnd = CreateWindow (

szName, // класс окна

" Application", // имя окна

WS_OVERLAPPEDWINDOW, // тип окна

CW_USERDEFAULT, // координата x

CW_USERDEFAULT, // координата y

CW_USERDEFAULT, // ширина

CW_USERDEFAULT, // высота

NULL, // дескриптор родительского окна

LoadMenu (hInstance, "menu"); // дескриптор метю

hInstance, // дескриптор копии

// приложения

NULL); // дополнительная

// информация

Таким образом, с окнами одного класса вы можете использовать различные меню. Можно также не указывать меню в структуре класса окна и при создании окна, а добавлять меню после его отображения, используя функцию SetMenu(). Это позволяет динамически изменить меню в процессе работы приложения:

SetMenu (hWnd, hMenu);