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

Частные контексты устройства (private device contexts) - это дисплейные контексты устройства (DC) , которые в отличие от общих контекстов устройства, сохраняют, любые изменения данных по умолчанию - каждое после того, как приложение освобождает их. Частные контексты устройства используются в прикладных программах, которые выполняют многочисленные операции рисования типа прикладных программ автоматизированного проектирования (CAD), программы настольных издательских систем, рисующие и окрашивающие прикладные программы, и так далее. Частные контексты устройства - не часть системного КЭШа, и поэтому не должны освобождаться после использования. Система автоматически удаляет частный контекст устройства после того, как было разрушено последнее окно этого класса .

Приложение создает частный контекст устройства в начале, определяя стиль класса окна CS_OWNDC, когда оно инициализирует поле style структуры WNDCLASS и вызывает функцию RegisterClass.

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

Контекст принтера

При необходимости вывода информации на принтер приложение должно создать контекст устройства, вызвав функцию CreateDC. В качестве аргументов функции передаются имя драйвера устройства, имя устройства и, при необходимости, данные для инициализации устройства. Используя полученные дескриптор контекста, можно подготовить устройство для печати и вывести необходимую информацию. Завершив работу с принтером, приложение должно удалить контекст принтера с помощью функции DeleteDC(), а не ReleaseDC().

 

Контекст в памяти

Чтобы дать возможность прикладным программам помещать вывод данных в память, а не отправлять их на реальное устройство (диск), используется специальный контекст устройства для операций с точечным рисунком, называемый контекст устройства в памяти (memory device context).

Сам по себе контекст в памяти не создаётся. Он создаётся как совместимый с тем устройством или окном, на которое предполагается копировать информацию. Контекст устройства (DC) в памяти дает возможность системе рассматривать часть памяти как виртуальное устройство. Это - массив битов в памяти, который приложение временно может использовать, чтобы сохранить данные о цвете для точечных рисунков, созданных на обычной поверхности для рисования. Поскольку точечный рисунок совместим с устройством, контекст устройства (DC) в памяти также иногда относится к совместимому контексту устройства (compatible device context).

Контекст устройства (DC) в памяти сохраняет образы точечных рисунков для конкретного устройства. Приложение может создать контекст устройства в памяти при помощи вызова функции CreateCompatibleDC.

Прежде, чем приложение может начать рисовать, оно должно выбрать точечный рисунок с соответствующей шириной и высотой в DC при помощи вызова функции SelectObject. Чтобы создать точечный рисунок соответствующих размеров, можно использовать функцию CreateBitmap, CreateBitmapIndirect или CreateCompatibleBitmap.

Когда приложение передает дескриптор, возвращенный CreateCompatibleDC одной из функций рисования, требуемый вывод данных не появляется на поверхности рисования устройства. Вместо этого, система сохраняет информацию о цвете для получающейся в результате линии, кривой, текста или региона (области) в массиве битов. Приложение может копировать образ, сохраненный в памяти обратно на поверхность рисования при помощи вызова функции BitBlt, идентифицируя контекст устройства (DC) в памяти, как исходный контекст устройства, а окно или контекст устройства (DC) экрана, как целевой контекст устройства.

 

Алгоритм работы с контекстом в памяти состоит из нескольких шагов:

1. Получениея хэндла контекста устройства (hDC) для окна, в которое будет осуществляться вывод изображения.

BeginPaint();

2. Получение хэндла bitmap’a, который будет отображаться в окне;

LoadImage();

3. Получение совместимого с hDC контекста в памяти (для хранения изображения) с помощью функции CreateCompatibleDC(). Функция имеет следующий прототип:

HDC CreateCompatibleDC(HDC hdc);

Параметр hdc позволяет указывать дескриптор существующего контекста устройства, с которым должен быть совместим создаваемый контекст. Если этот параметр равен NULL, то функция создает контекст в памяти, совместимый с текущим экраном приложения.

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

4. Выбора изображения (hBitmap) как текущего для контекста в памяти (hCompatibleDC).

SelectObject();

5. Копирования изображения контекста в памяти (hCompatibleDC) на контекст устройства (hDC).

StretchBlt();

6. Удаление совместимого контекста (hCompatibleDC);

DeleteDC();

7. Принятие мер для того, чтобы замещённый bitmap из контекста в памяти не остался в памяти;

DeleteObject();

8. Освобождение контекста устройства (hDC).

EndPaint();

 

Информационный контекст

Информационный контекст служит для получения информации о действительном контексте устройства. К примеру, для того, чтобы получить характеристики принтера или, если необходимо получить атрибуты графического устройства, то в таких случаях можно использовать усечённый контекст устройства, называемый информационным контекстом. Информационный контекст создаётся функцией CreateIC, прототип которой следующий:

HDC CreateIC(

LPCTSTR lpszDriver, – имя драйвера;

LPCTSTR lpszDevice, – имя устройства;

LPCTSTR lpszOutput, – имя порта или файла;

CONST DEVMODE* lpDvm – указатель на строку DEVMODE

);

 

Данный тип контекста создаётся и работает намного быстрее, а также занимает меньше памяти по сравнению с действительным контекстом.

В Win32-приложениях параметр lpszOutput всегда игнорируется и при вызове функции должен быть равным NULL. Параметр lpDvm задаёт адрес структуры типа DEVMODE, в которую записывается извлекаемая информация. Удалить информационный контекст можно вызвав функцию DeleteDC.