Контекст устройства является совокупностью атрибутов, которые определяют, как функции GDI работают на данном устройстве.
В момент, когда мы получаем контекст устройства (например, когда мы собираемся отображать текст или графические объекты в окне), Windows создает структуру контекста устройства и заполняет ее значениями, принятыми по умолчанию. Впоследствии приложение может считывать и при необходимости изменять атрибуты полученного контекста устройства. Однако при освобождении контекста устройства все изменения, произведенные в нем, теряются.
Приведенная таблица содержит список атрибутов контекста устройства и значения, присваиваемые им по умолчанию. Для режима MM_TEXT:
MM_TEXT
Режим битового образа
(0, 0)
Начало координат окна
(0, 0)
Начало физических координат
(1, 1)
Масштаб осей окна
(1, 1)
Масштаб осей физического устройства отображения
BLACK_PEN
Перо
WHITE_BRUSH
Кисть
SYSTEM_FONT
Шрифт
Битовый образ
(0, 0)
Текущая позиция пера
QPAQUE
Режим фона
White
Цвет фона
Black
Цвет текста
R2_COPYPEN
Режим отображения
BLACKONWHITE
Режим растяжения
ALTERNATE
Режим заполнения
Пространство между символами
(0, 0)
Исходное положение кисти
После получения контекста устройства приложение может изменить любой его атрибут. Однако данные изменения не сохраняются, и когда приложение в следующий раз получит контекст устройства, его атрибуты будут иметь значения, установленные Windows по умолчанию.
Если необходимо сохранять изменения, вносимые приложением в контекст устройства, нужно добавить флаг CS_OWNDC к полю типа окна в структуре класса окна:
nWndClass->style = ... | CS_OWNDC;
Теперь все изменения, вносимые приложением в контекст устройства, сохраняются в структуре класса окна до уничтожения вами этого окна. Как правило, изменения атрибутов контекста устройства производят при поступлении приложению сообщения WM_CREATE. Использование флага CS_OWNDC оказывает действие только при получении контекста устройства функциями BeginPaint и GetDC.
GDI предоставляет возможность сохранить контекст устройства перед его изменением, а затем восстановить его. Для этого можно пользоваться функциями SaveDC и RestoreDC. Функция SaveDC используется для сохранения контекста устройства, а функция RestoreDC – для его восстановления. Ниже представлены примеры вызова данных функций:
nSaveDC (hDC); // Сохраняем контекст устройства
... // Изменение контекста устройства
RestoreDC (hDC,nSaveDC); // Восстанавливаем контекст устройства