Окт 13

Первый метод получения дескриптора контекста устройства

Этот метод используется при обработке сообщения WM_PAINT. Контекст устройства получают вызовом функции Begin Paint, имеющей следующий прототип:
HDC BeginPaintC
HWND hwnd, // дескриптор окна
LPPAINTSTRUCT 1 Paint // указатель на структуру типа PAINTSTRUCT );
В случае успешного завершения функция возвращает дескриптор контекста дисплея для клиентской области окна.
Кроме этого функция заполняет поля структуры PAINTSTRUCT, имеющей следующее определение:
typedef struct tagPAINTSTRUCT {
HDC hdc; // контекст устройства
BOOL fErase; // признак стирания фона клиентской области
RECT rcPaint; // границы недействительного прямоугольника
BOOL fRestore;
BOOL flncUpdate;
BYTE rgbReserved[32]; } PAINTSTRUCT;
Последние три поля используются операционной системой.
Поле rcPaint типа RECT содержит координаты обновляемого прямоугольника в пикселах относительно левого верхнего угла клиентской области окна. Эти координаты либо определяются системой, либо задаются при вызове функции InvalidateRect. Регион отсечения в этом случае определяется посредством пересечения видимого региона и обновляемого прямоугольника.
Поле fErase определяет, будет ли Windows обновлять фон недействительного региона. Чаще всего fErase имеет значение TRUE, что означает стирание (обновление) фона. Когда обновляемый регион формируется вызовом функции InvalidateRect или InvalidateRgn, один из параметров этих функций разрешает или подавляет стирание фона.
Если задано стирание фона, то функция Begin Paint посылает оконной процедуре сообщение WM_ERASEBKGND. Приложение может обработать это сообщение, чтобы отобразить однородный или растровый фон. Однако обычно оно обрабатывается по умолчанию функцией DefWindowProc, которая обновляет фон с использованием кисти, определенной в поле hbrBackground класса окна.
Следует отметить, что функция BeginPaint сбрасывает обновляемый регион в NULL, или, другими словами, превращает недействительный регион в действительный. Это предотвращает повторную генерацию системой сообщения WM_PAINT до тех пор, пока обновляемый регион вновь не изменится.
До своего завершения функция BeginPaint посылает оконной процедуре еще одно сообщение — WM_NCPAINT. Оно заставляет приложение перерисовать так называемую неклиентскую область, которая представляет собой остальную часть окна — кроме клиентской области. Как правило, это сообщение обрабатывается также функцией DefWindowProc.
Типовой процесс обработки сообщения WM_PAINT выглядит следующим образом:
case WM_PAINT:
hDC = BeginPainUhWnd, &ps): [ использование функций GDI ] EndPaint(hWnd, &ps); return 0;
После завершения операций рисования приложение должно вызвать функции EndPaint, чтобы освободить контекст устройства.