- •Процедурное программирование
- •Регистрация класса окна
- •Создание окна
- •Командная строка приложения
- •Функции окна приложения
- •Сообщение wm_destroy
- •Вывод в рабочую область окна
- •Контекст устройства и область отрисовки.
- •Сообщение wm_paint
- •Окно-список
- •Заполнение окна-списка
- •Список файлов
- •Изменение цвета органов управления
- •Комбинированный список
- •Меню и назначение клавиш
- •Создание описания меню в файле ресурсов
- •Сообщения меню
- •Диалоговые окна ( диалоги )
- •Определение диалоговых окон в файле ресурсов
- •Диалоговое окно About
- •Функция диалогового окна
- •Взаимодействие с органами управления диалоговых окон
- •Окно сообщений
- •Ввод данных
- •Извлечение данных из диалога
- •Ввод - вывод данных посредством передачи сообщений
- •Функция CreateFile ( )
- •Функция WriteFile ( )
- •Отображение файла в память
- •Функция CreateFileMapping().
- •Функция MapViewOfFile()
- •Работа с отображенным файлом
- •И н т е р ф е й с графических устройств (gdi)
- •Контекст устройства
- •Получение индекса контекста устройства
- •Получение информации из контекста устройства
- •Атрибуты контекста устройства
- •Сохранение изменений в контексте устройства
- •Система координат в Windows
- •Режимы отображения
- •Системы координат
- •Режим mm_text
- •Метрические режимы
- •Режим mm_isotropic
- •Режим mm_anisotropic
- •Вывод графических объектов
- •Двумерные объекты
- •Сегмент и сектор эллипса
- •Библиографический список
Создание описания меню в файле ресурсов
Определение меню приложения, включенное в файл ресурсов, может быть создано как вручную, так и при помощи редактора меню, входящего в состав редактора ресурсов.
Определение меню, которое помещается в файл ресурсов, должно иметь следующий формат:
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);