Существуют несколько методов получения контекста устройства. Однако общим для них является то, что при получении контекста устройства в процессе обработки какого-либо сообщения необходимо также при обработке этого же сообщения освободить полученный контекст. Использование контекста устройства после его освобождения может привести к краху системы. Рассмотрим основные методы получения контекста устройства.
Первый метод используется при обработке сообщения WM_PAINT. При этом для получения контекста устройства вызывают функцию BeginPaint, а для его освобождения – функцию EndPaint. Обработчик данного сообщения в общем случае будет иметь следующий вид:
case WM_PAINT:
hDC= BeginPaint (hWnd, &ps);
...
EndPaint (hWnd, &ps);
break;
Первый параметр функции BeginPaint и EndPaint содержит дескриптор окна, контекст устройства которого вы желаете получить. Второй параметр содержит адрес переменной типа PAINTSTRUCT.
Структура PAINTSTRUCT содержит информацию, которую приложение может использовать по своему усмотрению. Данная структура содержит следующие поля:
typedef struct tagPAINTSTRUCT {
HDC hDC; // Дескриптор контекста отображения
BOOL fErase; // Флаг необходимого обновления фона окна
RECT rcPaint; // Прямоугольник обновления
BOOL fRestore; // Резервное поле
BOOL flncUpdate; // Резервное поле
BYTE rgbReserved[16]; // Резервное поле
} PAINTSTRUCT;
Наибольший интерес представляют поля hDC и rcPaint.
Поле hDC содержит индекс контекст устройства, который возвращает функция BeginPaint.
Поле rcPaint является указателем на структуру типа RECT, которая определяет прямоугольник внутри рабочей области экрана, содержимое которого надо обновить. Данное поле может заполняться при вызове функции InvalidateRect. При обработке сообщения WM_PAINT можно, используя содержимое данного поля структуры PAINTSTRUCT, обновлять не все окно, а только ту его область, которая нуждается в обновлении.
Второй метод получения контекста устройства используется при обработке всех других сообщений.
case WM_*** : // He WM_PAINT!!!
hDC=GetDC (hWnd); // Получаем контекст устройства
... // Использование функций GDI
ReleaseDC (hWnd, hDC); // Освобождаем контекст устройства
break;
Данный метод, также как и предыдущий, позволяет получить индекс контекста устройства (hDC) рабочей области окна, определяемого дескриптором окна (hWnd).
Следующий метод позволяет получить индекс контекста устройства для всего окна, а не только его рабочей области:
case WM_*** : // He WM_PAINT!!!
hDC=GetWindowDC (hWnd); // Получаем контекст устройства
... // Использование функций GDI
ReleaseDC (hWnd, hDC); // Освобождаем контекст устройства
break;
При использовании данного метода, кроме рабочей области окна, мы также получаем доступ к меню, полюсам просмотра и заголовка окна.
Если необходимо отобразить что-либо на экране вне какого-либо окна, то нужно получить индекс контекста устройства дисплея. Получить индекс контекста устройства для всего дисплея можно при помощи следующего вызова функции CreateDC:
case WM_*** : // He WM_PAINT!!!
// Получаем контекст устройства
hDC=CreatetDC («DISPLAY», NULL, NULL, NULL);
... // Использование функций GDI
DeleteDC (hWnd, hDC); // Освобождаем контекст устройства
break;
В некоторых случаях необходимо получить только некоторую информацию о контексте устройства. В этом случае вы можете получить индекс информационного контекста при помощи функции CreatetIC. Параметры данной функции соответствуют параметрам функции CreatetDC:
case WM_*** : // He WM_PAINT!!!
// Получаем контекст устройства
hDC=CreatetIC («DISPLAY», NULL, NULL, NULL);
... // Использование функций GDI
DeleteDC (hWnd, hDC); // Освобождаем контекст устройства
break;
Заметим, что информационный контекст, полученный при помощи функции CreatetIC, не может быть использован функциями GDI для отображения какой-либо информации на устройстве отображения.