Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI-ekz_shpory.docx
Скачиваний:
5
Добавлен:
25.09.2019
Размер:
185.19 Кб
Скачать
  1. Назначение и состав структуры 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]