- •Часть 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. Панель для выбора шрифта
П 3.2. Сообщение wm_paint
Стремление описывать вывод в окно при. обработке сообщения WM_PAINT. объясняется следующим. Windows следит за изменением расположения окон и при необходимости перерисовки окна посылает функции окна сообщение WM_PAINT. Функция окна при обработке этого сообщения перерисовывает все окно или указанные части.
Сообщение WM_PAINT обрабатывают следующим образом:
Case WM_PAINT:
{ PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd, &ps);
//Здесь настраивают контекст отображения и выводят в окно
EndPaint(hwnd, &ps);
return 0;
}
Структура PAINTSTRUCT описана следующим образом:
typedef struct { HDC hdc;
BOOL Erase;
RECT rcPaint;
BOOL fRestore;
BOOL flncUpdate;
BYTE rgbReserved(16];
} PAINTSTRUCT;
Поля переменной ps заполняет функция BeginPaint. Поеле ее вызова поле hdc структуры ps содержит дескриптор контекста отображения (тот же, который возвращает функция BeginPaint). Поле rcPaint содержит координаты прямоугольной области обновления. Поле fErase определяет необходимость стирания фона области обновления. Если fErase=TRUE фон окна стирается, иначе фон окна не изменяется. Остальные поля использует операционная система, приложение не должно изменять их содержимое.
После выполнения операций вывода приложение освобождает используемые ресурсы - вызывает функцию EndPaint.
Представим теперь, что содержимое окна требуется обновить при обработке других сообщений. Для этого функции обновляемого окна достаточно передать сообщение WM_PAINT.
Одна из функций, которые посылают сообщение WM_PAINT, а именно UpdateWindow, использовалась ранее.
Эта функция объявлена следующим образом:
BOOL UpdateWindow( HWND hwnd);
Она посылает сообщение WM_PAINT непосредственно функции окна hwnd. В случае успешного выполнения функция UpdateWmdow возвращает ненулевое значение, иначе - 0. Обычно ее вызывают для немедленной перерисовки области обновления.
Функция InvalidateRect добавляет прямоугольник в область перерисовки окна hwnd. Она объявлена следующим образом:
BOOL lnvalidateRect( HWND hwnd, CONST RECT *lpRect, BOOLbErase);
Параметр hwnd указывает на обновляемое окно. Если это параметр указывает на NULL, перерисовывают все окна. Параметр IpRect указывает на нуждающийся в обновлении прямоугольник в рабочей области. Если lpRect=NULL, то нужно обновить всю рабочую область окна hwnd. Параметр bErase определяет, нужно ли перекрасить фон указанной прямоугольной области. Если bErase=TRUE, фон перекрашивают, иначе фон остается неизменным.
В случае успешного выполнения функция возвращает ненулевое значение.
Добавляемые прямоугольники накапливаются до обработки сообщения WM_PAINT. В качестве единой области перерисовки Windows вычисляет один прямоугольник, который охватывает все добавленные Прямоугольники.
Функция ValidateRect удаляет прямоугольную область из списка прямоугольников перерисовки. Прототип этой функции:
BOOL ValidateRect( HWND hwnd, CONST RECT IpRect);
Параметр hwnd указывает на окно, из области перерисовки которого исключается прямоугольник. Если этот параметр NULL, Windows перерисовывает все окна - посылает сообщения WM_ERASEBKGND и WM_ NCPAINT функциям всех окон. Параметр IpRect указывает на прямоугольник, который будет удален от области перерисовки. Если lpRect=NULL, из области обновления удаляют все прямоугольники.
В случае успешного выполнения функция возвращает ненулевое значение.
Функция BeginPaint из области обновления удаляет всю рабочую область окна.