- •Часть 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.6.2. Сообщения о меню в строке состояний
Строку состояния часто используют для выдачи уведомительных сообщений о строках и разделах меню в процессе перемещения курсора по меню.
В процессе перемещения по строкам меню функция окна, к которому подключено меню, получает сообщение WM_MENUSELECT. При этом младшее слово napаметpa wParam равно идентификатору Команды или позиции (если при выборе этой строки отображается временное меню) строки. Параметр lParam содержит дескриптор меню, по которому перемещается курсор.
Воспользуемся этим для выдачи сообщений в процессе перемещения по строкам меню.
Задача. Предположим, что приложение имеет динамическое меню. В процессе перемещения по строкам меню сообщать о разделе главного меню и о той строке, над которой находится курсор.
Листинг . Сообщения о меню в строке состояния (фрагмент программы)
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
static HWND hStatus;
static int pParts[2];
static short cx;
switch (msg) {
case WM_SIZE:
{ MoveWindow(hStatas,0,M,0,TRUE);
cx=LOWORD(IParam);
pParts[0]=cx/2;
pParts[1]=cx;
SendMessage(hStatus, SB_SETPARTS,2,(LPARAM)pParts);
return O;
}
case WM_CREATE:
{
hStatus=CreateStatusWindow(WS_CHILD | WS_VISIBLE, “Готаво”, hwnd, ID_STATUS); retum 0;
}
case WM_MENUSELECT: {
if ((HMENU)lParam = =hMainMenu)
{ switch (LOWORD(wParam))
{ case 0:
SendMessage(hStatus, SB_SETTEXT,0,
(LONG)"Oткрыть/закрыть документ или выход");
SendMessage(hStatus, SB_SETTEXT,1, NULL);
retum 0;
case1:
SendMessage(hStatus, SB_SETTEXT,0,
(LONG)"Haйти и/или заменить фрагмент");
SendMessage(hStatus, SB_SETTEXT,1, NULL);
retum 0;
case2:
SendMessage(hStatus, SB_SETTEXT,0,
(LONG)"Cмeнa способа отображения документа");
SendMessage(hStatus, SB_SETTEXT,1, NULL);
return 0;
} }
switch(LOWORD(wParam)) {
case CM_FILE_OPEN:
{ SendMessage(nStatus,SB_SETTEXT,1, (LONG)"Открыть новый документ");
return 0;
}
case CM_FILE_SAVE:
{ SendMessage(hStatus,SB_SETTEXT,1,(LONG)"3aкрыть текущий документ");
return 0;
}
case CM_EDIT_FIND:
{ SendMessage(nStatus,SB_SETTEXT,1,
(LONG)”Haйти фрагмент no выделенному образцу");
return O;
}
case CM_FILE_QUIT:
{ SendMessage(hStatus,SB_SETTEXT,1,(LONG)"Завершить работу приложения");
return 0;
}
} return 0;
Рассмотрим основные моменты фрагмента:
1. Обработка сообщения WM_MENUSELECT состоит из трех частей.
1.1. Отдельно обрабатывают перемещение по названиям разделов главного меню. Если параметр lParam равен дескриптору главного меню, то определяют значение позиции курсора. Это значение содержится в LOWORD(wParam), если строка связана с разделом меню. Мы знаем, какой раздел соответствует каждой позиции. Например, в первой позиции (ей соответствует LOWORD (wParam)=0) находится раздел "Файл". В этом случае в первой части строки состояния отображают текст "Открыть/закрыть документ или выход":
SendMessage{ hStatus, SB_SETTEXT, 0,
(LONG)"Oткрыть/3aкрыть документ или выход");
и стирают текст во второй части строки состояния:
SendMessage( hStatus, SB_SETTEXT, 1, NULL);
Точно так же обрабатывают другие позиции курсора в главном меню. Если строки временных меню указывают на разделы меню, то для них также нужно предусмотреть обработку перемещения no позициям. Обратите внимание, что условный оператор
if ((HMENU)lParam-=hMainMenu)
{ switch (LOWORD{wParam))
{ case 0:
. . .
}
}
завершает обработку сообщения оператором возврата, только
если курсор установлен на строке раздела меню. То есть не все строки меню с дескриптором lParam должны указывать на разделы меню.
1.2. Здесь мы оказываемся в том случае, если младшее слово параметра wParam может быть равно идентификатору команды строки меню. Тогда достаточно определить этот идентификатор и послать соответствующий текст сообщения во вторую часть строки состояния. Например, если курсор находится над строкой "Открыть" раздела "Файл", то во второй часта строки состояния окажется текст "Открыть новый документ":
SendMessage(hStatus,SB_SETTEXT,1, (LONG)"Oткрыть новый документ*);
Точно так же поступают для других идентификаторов команд.
1.3. Обработку завершают возвратом значения 0.
После выбора строки меню содержание частей строки состояния остается таким, каким оно было в момент выбора. То есть строка состояния напоминает о последней выбранной команде меню.