- •Часть II. Проектирование пользовательских интерфейсов средствами win32 api п 1. Основы приложений для Windows. П 1.1 Типы данных Windows.
- •П. 1.2 Главная функция приложения WinMain().
- •П. 1.3 Оконная функция.
- •П. 1.4 Сообщения от окна
- •П. 1.5 Сообщения от мыши
- •1.5.1 Сообщения мыши, связанные с рабочей областью окна
- •1.5.3 Двойные щелчки мыши
- •1.5.4 Сообщения мыши, связанные с нерабочей областью окна
- •1.5.5 Захват мыши
- •П. 1.6 Сообщения от клавиатуры
- •1.6.1 Синхронизация событий клавиатуры
- •1.6.2 Игнорирование событий клавиатуры
- •1.6.3 Понятие фокуса ввода
- •1.6.4 Категории клавиатурных сообщений
- •1.6.5 Аппаратные сообщения
- •1.6.6 Символьные сообщения
- •П. 1.7 Таймеры Windows и служба времени.
- •П. 1.8 Классы окон
- •1.8.1. Описание используемых классом окон ресурсов
- •1.8.2. Регистрация класса окон
- •1.8.3. Создание окон
- •1.8.4. Стили окна
- •П. 1.9 Цикл обработки сообщений
- •П. 1.10 Структура текста приложения
- •П. 1.11 Вспомогательные функции создания окон
- •1.11.1 Функции отображения и перерисовки окон
- •1.11.2 Функции поиска и определения состояния окон
- •1.11.3 Функции перемещения окон
- •1.11.4 Сообщения приложения для пользователя
- •П. 1.12 Примеры создания окон
- •П 2. Органы управления
- •П 2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •П 2.2. Статический орган управления
- •П 2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •П 2.4 Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •П 2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •П. 2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •П 3. Вывод в окно
- •П. 3.1. Виды контекста отображения
- •П 3.2. Сообщение wm_paint
- •П 3.3. Установка атрибутов контекста отображения для текста
- •П 3.4. Вывод текста
- •3.4.1. Настройка параметров шрифта
- •3.4.2. Выбор шрифта в контекст отображения
- •3.4.3. Функции вывода текста
- •3.4.4. Определение метрик шрифта
- •П 3.5. Рисование геометрических фигур
- •3.5.1 Установка атрибутов контекста отображения для рисования.
- •3.5.1. Функции рисования точки
- •3.5.2. Функции рисования линий
- •3.5.3. Функции рисования замкнутых фигур
- •3.5.4 Функции создания и рисования регионов
- •П. 4 Ресурсы приложения и их использование. П. 4.1 Файл ресурсов.
- •П 4.2 Главное меню
- •П. 4.2.1 Элементы меню
- •П. 4.2.2 Создание меню
- •П. 4.2.3 Сообщения от меню
- •П. 4.3. Плавающее меню
- •П. 4.4. Акселераторы
- •П. 4.5. Панель инструментов
- •4.5.1. Создание панели инструментов
- •4.5.2. Управление состоянием кнопок панели
- •4.5.3. Вывод подсказок в панели инструментов
- •П. 4.6. Строка состояния
- •4.6.1. Создание строки состояния
- •4.6.2. Сообщения о меню в строке состояний
- •П 5. Диалоговые панели п. 5.1. Характеристики диалоговых панелей
- •5.1.1. Единицы диалоговой панели '
- •5.1.2. Стили диалоговой панели
- •5.1.3. Функция окна диалоговой панели
- •П. 5.2. Создание диалоговой панели
- •5.2.1 Создание окна модальной диалоговой панели
- •5.2.2 Создание окна немодальной диалоговой панели
- •П. 5.3 Разработка и компоновка диалоговых панелей.
- •П. 5.4 Сообщения и диалоговые панели
- •П. 5.5. Стандартные диалоговые панели
- •5.5.1. Панели для открытия или сохранения файлов
- •5.5.2. Панель для выбора цветов
- •5.5.3. Панель для выбора шрифта
П. 4.2.2 Создание меню
Алгоритм создания меню в общем случае содержит следующие шаги:
1. Создание пустого меню hMenu.
2. Вставка элемента в меню hMenu.
3. Шаг 2 повторяем столько раз, сколько элементов содержит меню hMenu.
Этот алгоритм позволяет создавать многоуровневое меню. Например, вставляемый на 2-м шаге элемент может указывать на уже созданное временное меню. Причем любой элемент последнего также может указывать на временное меню.
Меню сначала создают только в памяти. Существуют функции, которые операционной системе указывают, какое меню создано, какому окну оно принадлежит и когда его отображать. Рассмотрим эти функции.
Функция CreateMenu создает пустое главное меню окна:
HMENU CreateMenu(VOID);
В случае успешного выполнения функция CreateMenu возвращает дескриптор созданного главного меню, иначе - NULL.
Функция CreatePopupMenu создает пустое временное меню:
HMENU CreatePopupMenu(VOID);
В случае успешного выполнения функция CreatePopupMenu возвращает дескриптор созданного временного меню, иначе - NULL.
Функция SetMenu подключает главное меню hMenu к окну hwnd:
BOOL SetMenu(HWND hwnd, HMENU hMenu);
Она удаляет предыдущее меню, но не разрушает его. Если же hMenu= = NULL, то только удаляется главное меню. В случае успешного подключения функция возвращает ненулевое значение.
После изменений в меню, независимо от состояния окна hwnd, для перерисовки полосы меню нужно вызвать функцию DrawMenuBar:
void WINAPI DrawMenuBar(HWND hwnd);
Она перерисовывает полосу меню окна hwnd.
Таким образом, алгоритм подключения главного меню к окну и отображения полосы меню содержит следующие шаги:
1. Создание главного меню. Этот шаг полностью совпадает с алгоритмом создания меню.
2. Подключение главного меню к окну.
3. Перерисовка полосы меню окна.
После этого работу с меню обеспечивает операционная система.
Приложение в созданное меню может вставлять новые элементы или удалять старые, а также может изменять или запрашивать текущее состояние любого элемента.
Вставка элементов в меню
Функция InsertMenuItem вставляет элемент в меню hMenu:
BOOL lnsertMenultem(HMENU hMenu, UINT ultem,
BOOL fByPosition, LPMENUITEMINFO tpmii);
Значение аргумента ultem зависит от значения fflyPosition При fByPosition=FALSE значение uItem равно идентификатору команды вставляемого элемента, иначе - позиции того элемента в меню, перед которым нужно вставить новый элемент. Если меню содержит п элеметов и нужно вставить новый элемент последним, то номер позиции приравнивают п (п=0,1, 2, .)
Параметр Ipmii указывает на структуру типа MENUITEMINFO, которая уже содержит информацию о вставляемом элементе.
В случае успешной вставки элемента функция возвращает ненулевое значение.
Удаление элементов из меню
Функция DeleteMenu удаляет элемент из меню и освобождает все связанные с ним ресурсы. Если удаляемый элемент указывает на временное меню, то функция DeIeteMenu удаляет и это временное меню. Прототип функции:
BOOL DeleteMenu( HMENU hMenu, UINT uPosition, UINT uFiags);
Параметры:
1. hMenu - дескриптор изменяемого меню.
2. uPosition определяет удаляемый элемент. Его значение связано со значением параметра uFlags.
3. nFlags задает способ истолкования параметра uPosition. Если uFlags=MF_BYCOMMAND {значение по умолчанию), то значение uPosition равно идентификатору команды удаляемого элемента. Если же uFlags=MF_BYPOSITION, то значение uPosition равно позиции удаляемого элемента в меню.
В случае успешного удаления функция возвращает ненулевое значение.
Функция RemoveMenu удаляет элемент из меню, не разрушая связанные с ним ресурсы. Эти ресурсы можно использовать в дальнейшем. Прототип функции:
BOOL RemoveMenu( HMENU hMenu, UINT uPosffion, UINT uFlags);
Параметры функции RemoveMenu подобны параметрам функции DeleteMenu. B случае успешного удаления элемента RemoveMenu возвращает ненулевое значение.
Для разрушения меню вызывают функцию DestroyMenu:
BOOL DestroyMenu( HMENU hMenu);
Эта функция разрушает заданное меню и освобождает ресурсы, которые меню занимает. Эту функцию окна вызывают для разрушения тех меню, которые они создали, но не подключили к себе. Подключенные меню автоматически разрушаются при разрушении окна.
В случае успешного разрушения функция возвращает ненулевое значение.
Управление состоянием элементов меню
Следующая функция изменяет состояние элемента меню hMenu:
BOOL Se(Menultemlnfo( MENU hMenu, UINT uItem,
BOOL myPo5fflon, LPMENUITEMINFO lpmii);
При fByPosition=FALSE значение uItem равно идентификатору команды элемента, иначе - позиции элемента в меню. Значение lpfflii указывает на структуру типа MENUITEMINFO, которая уже содержит новые данные для элемента. В случае успешного выполнения функция возвращает ненулевое значение.
Проанализируем вызов функции SetMenuItemInfo. Первые 3 аргумента указывают на элемент, параметры которого изменяют. Последний аргумент содержит параметры нового состояния элемента. При этом изменяют те параметры, на которые указывает поле fMask.
Следующая функция выбирает данные элемента меню hMenu:
BOOL GetMenultemlnfo (HMENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
При fByPosition=FALSE значение uItem равно идентификатору ко« манды элемента, иначе - позиции элемента в меню. Значение lpmii указывает на структуру типа MENUITEMINFO, поле fMask которой содержит указания на запрашиваемые параметры. В эту же структуру будут записаны значения запрошенных параметров элемента. В случае успешного выполнения функция возвращает ненулевое значение.
Получение информации о меню
Функция GetMenu возвращает дескриптор главного меню окна hwnd:
HMENUGetMenu(HWNDhwnd);
Если окно не имеет меню, функция возвращает NULL. -
Функция GetSubMenu возвращает дескриптор временного меню, ко> торое расположено в позиции nPos указанного меню hmenu:
HMENU GetSubMenu(HMENUhmenu, int nPos);
Причем первому временному меню в hmenu соответствует нулевое значение параметра nPos-Есаи функция GetSubMenu вернула значение NULL, то hmenu в позиции nPos не содержит временное меню.
Функция kMenu возвращает ненулевое значение, если hmenu является дескриптором меню, иначе - возвращает нуль:
BOOL IsMenu (HMENUhmenu);
Функция GetMenuItemCount возвращает количество элементов в меню hmenu:
int GetMenultemCount(HMENUhmenu);
В случае ошибки возвращаемое значение равно -1.