- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция.
- •Файл определения модуля.
- •Структура windows – программы.
- •Структура программы в Windows:
- •Сообщения. Источники сообщений
- •Формирование сообщений, примеры. Очереди.
- •Сообщения. Цикл сообщений, основные компоненты.
- •Сообщения. Структура сообщений на примере wm_command
- •Структура msg. Обработка сообщений.
- •Средства обработки сообщений в приложении и windows.
- •Окна, классы и типы окон.
- •Регистрация класса окна, основные элементы класса.
- •Int cbClsExtra; // 3. Доп. Память для окон, созд-мых на базе данного класса
- •Int cbWndExtra; // 4. Доп. Память для создания окна (3, 4 – в байтах)
- •Линейки прокрутки, переключатели, окна пометки, окна списка.
- •1. Кнопки, переключатели (переключатели – кнопки с 3-мя состояниями (вкл, выкл и неактивен)
- •2. Полосы прокрутки.
- •3. Окна списка
- •Комбинированные списки, окна редактирования и статические текстовые объекты.
- •1. Комбинированные списки
- •2. Окна редактирования
- •3. Статический орган управления (статический текстовый объект)
- •Способы создания меню
- •Создание меню в файле ресурсов
- •С помощью функций в теле программы
- •Создание меню редактором ресурсов
- •Определение диалоговой панели, взаимодействие пользователя с панелью.
- •1. Создание шаблона.
- •2. Создание функции диалога.
- •3. Вызов одной из функций создания диалога
- •Диалоговые панели, модальные панели.
- •Немодальные панели. Отличие циклов сообщений.
- •Ресурсы. Файл ресурсов, текстовый, бинарный. Создание.
- •Файл определения модуля. Назначение, основные директивы (относящиеся к коду и данным).
- •Графический приборный интерфейс gdi. Состав, назначение.
- •Контекст, содержание контекста.
- •Общий контекст, родительский, личный, для класса окна, физический.
- •1. Общий контекст отображения.
- •2. Контекст отображения для класса окна
- •3. Личный контекст отображения
- •4. Родительский контекст отображения
- •5. Контекст физического устройства
- •Последовательность действий приложения при формировании рисунка
- •Преобразование логических координат в физические и наоборот, единицы измерений, масштабирование.
- •Назначение и состав структуры paintstruct. Сообщение wm_paint.
- •Int right; х-коор-та нижнего правого угла
- •Int bottom; y-коор-та
- •Дополнительные темы.
- •Аппаратная независимость
- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция
Назначение и состав структуры paintstruct. Сообщение wm_paint.
Окно должно быть способно перерисовать свою внутреннюю поверхность или любую его часть в любой момент времени при получении сообщения WM_PAINT.
Сообщение WM_PAINT передается функции окна, если стала видна область окна, скрытая раньше другими окнами, если вы изменили размер окна или выполнили операцию свертки (пролистывания) изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции UpdateWindow, InvalidateRect или InvalidateRgn.
Иногда операционная система Windows может сама восстановить содержимое окна, не посылая сообщение WM_PAINT. Например, при перемещении курсора мыши или пиктограммы свернутого приложения Windows самостоятельно восстанавливает содержимое окна. Если же Windows не может восстановить окно, функция окна получает сообщение WM_PAINT и перерисовывает окно самостоятельно.
Перед тем как записать сообщение WM_PAINT в очередь приложения, Windows посылает функции окна сообщение WM_ERASEBKGND (см. параметр № 2 для PAINTSTRUCT). Если функция окна не обрабатывает сообщение WM_ERASEBKGND, передавая его функции DefWindowProc, последняя в ответ на это сообщение закрашивает внутреннюю область окна с использованием кисти, указанной в классе окна (при регистрации класса окна).
Функция окна может определить область окна, подлежащую обновлению при обработке сообщения WM_PAINT из данных в структуре PAINTSTRUCT, являющейся 2-м параметром функции BeginPaint:
HDC BeginPaint(HWND hwnd, PAINTSTRUCT FAR * lpps);
Структура PAINTSTRUCT определена в файле windows.h следующим образом:
typedef struct tagPAINTSTRUCT
{ HDC hdc; //идентификатор контекста отображения
BOOL fErase; //стирать фона окна в области, подлежащей обновлению?
RECT rcPaint; //структура, описывающая прямоуг. область
BOOL fRestore; //остальные пар-ры исп-ся Windows, не должны изменяться.
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
2 – если да, то функция BeginPaint посылает функции окна сообщение WM_ERASEBKGND
3 – структура типа RECT, описывающую прямоугольную область (координаты задаются в пикселях):
typedef struct tagRECT
{ int left; х-коор-та верхнего левого угла
int top; y-коор-та
Int right; х-коор-та нижнего правого угла
Int bottom; y-коор-та
} RECT;
Если окно содержит несколько областей, подлежащих обновлению, приложение получает только одно сообщение WM_PAINT, в котором определена область, охватывающая все указанные выше области.
Рассмотрим некоторые функции, имеющие отношение к сообщению WM_PAINT.
1. Функция UpdateWindow имеет следующий прототип: void UpdateWindow(HWND hwnd);
Эта функция посылает сообщение WM_PAINT функции окна, идентификатор которого задан в качестве параметра hwnd, в обход очереди сообщений приложения, если для окна существует непустая область обновления.
2. При помощи функции InvalidateRect вы можете объявить любую область окна как требующую обновления.
void InvalidateRect(HWND hwnd, LPRECT lprc, BOOL fErase);
1 – идентификатор окна, для которого выполняется операция.
2 – дальний указатель на структуру типа RECT, определяющую прямоугольную область, подлежащую обновлению.
3 – необходимость стирания фона окна.
3. Функция ValidateRect удаляет прямоугольную область из списка областей, подлежащих обновлению:
void ValidateRect(HWND hwnd, LPRECT lprc);
Итоги:
А) Приложение должно выполнять вывод в окно "централизованно" в функции окна при получении сообщения WM_PAINT.
Б) При обработке сообщения WM_PAINT для увеличения скорости работы следует использовать координаты области окна, подлежащей обновлению, хотя можно обновить и все окно.
В) Используя специальные функции, приложение в любой момент времени может определить любую область окна как подлежащую (или не подлежащую) обновлению и послать самому себе в соответствующую функцию окна сообщение WM_PAINT.