Как правило, приложения выполняют всю работу по рисованию во время обработки сообщения 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, в следующий раз при получении общего контекста отображения эти атрибуты снова примут значения по умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения.