Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.2.3 Структура информации о рисовании

Ранее уже говорилось о структуре информации о рисовании, которая поддерживается в Windows для каждого окна. Это PAINTSTRUCT. Структура определяется так:

typedef struct tagPAINTSTRUCT

{

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT;

Windows заполняет поля этой структуры, когда ваша программа вызывает BeginPaint. Вам в программе можно использовать только первые три поля структуры. Остальные используются Windows.

Поле hdc — это описатель контекста устройства. Возвращаемым значением функции BeginPaint также является описатель контекста устройства, и такая избыточность характерна для Windows.

В подавляющем большинстве случаев, в поле fErase установлен флаг TRUE (т. е., ненулевое значение), означающий, что Windows обновит фон недействительного прямоугольника. Windows перерисует фон, используя кисть, заданную в поле hbrBackground структуры WNDCLASSEX, которую вы использовали при регистрации класса окна во время инициализации WinMain. Многие программы для Windows используют белую кисть:

wndclass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);

Однако, если вы, вызывая функцию InvalidateRect, делаете недействительным прямоугольник рабочей зоны вашей программы, то последний параметр этой функции определяет, хотите ли вы стирать фон. Если этот параметр равен FALSE (т. е. 0), Windows не будет стирать фон и поле fErase также будет равно FALSE.

Поле rcPaint структуры PAINTSTRUCT — это структура типа RECT. Как вы знаете из главы 2, структура RECT определяет прямоугольник. В ней имеется четыре поля: left, top, right и bottom. Поле rcPaint структуры PAINTSTRUCT определяет границы недействительного прямоугольника. Значения заданы в пикселях относительно левого верхнего угла рабочей области. Недействительный прямоугольник — это та область, которую вы хотите перерисовать. Хотя программа для Windows может просто перерисовать всю рабочую область окна при получении сообщения WM_PAINT, перерисовка только той области окна, которая задана этим прямоугольником, экономит время.

Прямоугольник rcPaint в PAINTSTRUCT — это не только недействительный прямоугольник, это также и "отсекающий" (clipping) прямоугольник. Это означает, что Windows рисует только внутри отсекающего прямоугольника. (Или точнее, если недействительная зона не является прямоугольником, Windows рисует только внутри этой зоны.) Когда вы используете описатель контекста устройства из структуры PAINTSTRUCT, Windows не будет рисовать вне прямоугольника rcPaint.

Чтобы при обработке сообщения WM_PAINT рисовать вне прямоугольника rcPaint, вы можете сделать вызов:

InvalidateRect(hWnd, NULL, TRUE);

перед вызовом BeginPaint. Это сделает недействительной всю рабочую область и обновит ее фон. Если же значение последнего параметра будет равно FALSE, то фон обновляться не будет. Все что там было, останется неизменным.

В программе HELLOWIN из главы 2 мы не думали о недействительных или отсекающих прямоугольниках при обработке сообщения WM_PAINT. Если оказывалось, что область вывода текста на экран находится внутри недействительного прямоугольника, то функция DrawText перерисовывала ее. Если при обработке вызова DrawText Windows не находит такие области, на экран ничего не выводится. Но такой поиск требует времени.

Программист, заботящийся об эффективности и быстродействии, захочет при обработке сообщений WM_PAINT использовать размеры недействительного прямоугольника, чтобы не обращаться лишний раз к вызовам GDI.

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