Контекст устройства – структура, определяющая набор графических объектов и связанных с ними атрибутов и графических режимов, которые воздействуют на вывод. Графические объекты включают карандаши для рисования линий, кисти для закрашивания и заполнения, битовые образы для копирования или прокрутки части экрана, цветовые палитры для определения набора доступных цветов, области для отсечения и других операций, а также контуры для операций рисования и закрашивания.

Приложение не имеет прямого доступа к контексту устройства, и настройка параметров осуществляется посредством вызова соответствующих функций Win32 API.

Существуют четыре типа контекстов устройств:

• экранный – поддерживает операции рисования непосредственно на экране;

• принтера – поддерживает операции рисования непосредственно на принтере или плоттере;

• памяти – поддерживает операции рисования непосредственно в битовых массивах;

• информационный – поддерживает получение данных об устройстве.

Приложение может осуществлять следующие операции над контекстом устройства:

• перечисление существующих графических объектов;

• выбор новых графических объектов;

• удаление существующих графических объектов;

• сохранение графических объектов, их атрибутов и параметров графических режимов;

• восстановление графических объектов, их атрибутов и параметров графических режимов.

Помимо всего прочего, приложение может использовать контекст устройства для определения процесса графического вывода, прерывания длительных графических операций, начатых другим потоком многопоточного приложения, а также может инициализировать принтер.

Экранный контекст устройства

Приложение получает контекст устройства экрана посредством вызова функций BeginPaint, GetDC или GetDCEx. Полученный контекст устройства идентифицирует окно, в которое будет непосредственно осуществляться вывод. Как правило, приложение получает контекст устройства экрана непосредственно перед тем, когда ему необходимо рисовать в клиентской области. Когда приложение завершает вывод, то оно обязано освободить контекст устройства, вызвав одну из соответствующих функций: EndPaint или ReleaseDC.

Win32 API позволяет получать три типа контекста устройства экрана: контекст класса, общий и частный контексты. Контекст класса и частные контексты устройства используются в приложениях, выполняющих многочисленные операции вывода. Например, программы автоматизированного проектирования, настольные издательские системы, то есть такие приложения, которые самостоятельно и постоянно осуществляют вывод, и соответственно время, затрачиваемое на эти операции, критично с точки зрения производительности. Общие контексты устройства используются в приложениях, выполняющих операции вывода лишь время от времени.

Контекст класса поддерживается только для совместимости с предыдущими версиями Windows. При создании Win32-приложения вместо контекстов класса следует использовать частные контексты.

Общий контекст устройства – контекст устройства экрана, который обрабатывается в специальном кэше системы. Такие контексты устройства используются в приложениях, осуществляющих операции вывода не очень часто. Перед тем как система возвращает описатель контекста устройства, она предварительно инициализирует общие контексты устройства значениями по умолчанию, которые можно менять по мере необходимости при помощи специальных функций. Любая операция вывода, выполняемая приложением, будет использовать значения по умолчанию до тех пор, пока не будет вызвана одна из функций GDI для выбора нового графического объекта, изменения атрибутов существующего объекта или выбора нового режима. Поскольку может быть создано лишь определенное количество общих контекстов устройства, то приложение обязано освободить его после того, как осуществит операции вывода. Когда приложение освобождает общий контекст устройства, все произведенные в данных изменения по умолчанию будут отменены. В результате параметры необходимо устанавливать каждый раз заново.

Частный контекст устройства, в отличие от общего, сохраняет любые изменения для заданных по умолчанию данных. Этот контекст устройства не является частью системного кэша и поэтому не должен освобождаться. Система автоматически освободит его только после того, как последнее окно будет разрушено. Приложение создает частный контекст устройства (указав предварительное SOWNDC стиль окна) при заполнении структуры, описывающей класс окна, регистрируемого функцией RegisterClass. После создания окна с указанным стилем приложение может вызвать одну из функций (GetDC, GetDCEx или BeginPaint) для получения описателя, идентифицирующего частный контекст устройства. Приложение может использовать его до тех пор, пока не будет разрушено окно, созданное с этим классом. Любые изменения графических объектов и их атрибутов или графических режимов сохраняются системой, пока окно не удалено.