Общий контекст отображения

Как правило, приложения выполняют всю работу по рисованию во время обработки сообщения WM_PAINT, хотя часто требуется рисовать и во время обработки других сообщений. Приложение должно придерживаться следующей последовательности действий:

· получение или создание контекста отображения;

· установка необходимых атрибутов в контексте отображения;

· выполнение операций рисования;

· освобождение или удаление контекста отображения.

Для получения навыков работы с контекстом мы рассмотрим общий контекст отображения.

Для получения общего контекста отображения приложение должно вызвать функцию BeginPaint (при обработке сообщения WM_PAINT) или GetDC (при обработке других сообщений). При этом перед регистрацией класса окна в поле стиля класса окна в структуре WNDCLASS не должны использоваться значения CS_OWNDC, CS_PARENTDC или CS_CLASSDC: например, wc.style = 0;

Функции BeginPaint и GetDC возвращают контекст отображения для окна hwnd:

HDC WINAPI BeginPaint(HWND hwnd, PAINTSTRUCT FAR* lpps);HDC WINAPI GetDC(HWND hwnd);

При этом функция BeginPaint подготавливает указанное окно для рисования, заполняя структуру типа PAINTSTRUCT (адрес которой передается через параметр lpps) информацией, которую можно использовать в процессе рисования.

После использования контекст отображения, надо освобождать. Если контекст получали, используя функцию BeginPaint, то для освобождения надо использовать функцию void WINAPI EndPaint (HWND hwnd, const PAINTSTRUCT FAR* lpps). Если контекст получали, используя функцию GetDC, то используем int WINAPI ReleaseDC (HWND hwnd).

Плюсы и минусы общего контекста

Плюсы: этот контекст используется чаще всего и поэтому для ускорения доступа к нему Windows использует кеширование (размер кеша достаточен для хранения только пяти контекстов отображения).

Минусы: каждый раз, когда приложение получает общий контекст отображения, его атрибуты принимают значения по умолчанию. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции GDI, в следующий раз при получении общего контекста отображения эти атрибуты снова примут значения по умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения.




double arrow
Сейчас читают про: