Контекст устройства


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

1) Перо (pen) для рисования линий;

2) Кисть (brush) для заполнения фона или заливки фигур;

3) Растровое изображение (bitmap) для отображения в указанной области окна;

4) Палитра (palette) для определения набора доступных цветов;

5) Шрифт (font) для вывода текста;

6) Регион (region) для отсечения области вывода.

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

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

В Windows поддерживаются следующие типы контекстов устройств:

1) контекст дисплея;

2) контекст принтера;

3) контекст в памяти (моделирует в памяти устройство вывода);

4) информационный контекст (служит для получения данных от устройства).

 

При выводе информации на дисплей Windows оперирует с несколькими типами регионов:

1) Обновляемый регион (недействительный регион) – часть окна, которая требует обновления после возникновения тех или иных событий.

2) Видимый регион – часть окна, которую в данный момент видит пользователь. Система изменяет видимый регион окна, когда окно изменяет размеры, и в том случае, когда перемещение другого окна либо закрывает часть данного окна, либо открывает закрытую прежде часть;

3) Регион отсечения ограничивает область внутри которой система разрешает отображение графической информации. Когда приложение получает контекст устройства при помощи функции BeginPaint, система устанавливает регион отсечения путём пересечения видимого региона и обновляемого региона. Если при создании окна функцией CreateWindow был использован стиль WS_CLIPCHILDREN WS_CLIPSIBLINGS, то из видимого региона исключаются любые дочерние или “сестринские» окна, при этом рисование не затрагивает отображаемые области таких окон.

Отсечение (clipping) - процесс ограничения вывода региона или пути в пределах рабочей области окна прикладной программы.

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

Регион отсечения - это один из графических объектов, который приложение может выбрать в контекст устройства (DC). Он является обычно прямоугольным. Некоторые контексты устройства обеспечивают предопределенный или по умолчанию регион отсечения, в то время как другие этого не делают. Например, если Вы получаете дескриптор контекста устройства от функции BeginPaint, то контекст устройства (DC) имеет в своем составе предопределенный прямоугольный регион отсечения, соответствующий недействительному прямоугольнику, который требует перерисовки. Однако, когда Вы получаете дескриптор контекста устройства, вызывая функцию GetDC со значением параметра hWnd ПУСТО (NULL), или вызываете функцию CreateDC, контекст устройства (DC) не содержит регион отсечения по умолчанию.

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

Определить, появляется ли вывод данных графики в пределах границ региона, передавая координаты соответствующей линии, дуги, точечного рисунка, текста или закраски фигуры в функцию PtVisible.

Определить, не совпадает ли часть рабочей области с регионом, вызывая функцию RectVisible.

Переместить существующий регион на указанное смещение, вызывая функцию OffsetClipRgn.

Исключить прямоугольную часть рабочей области из текущего региона отсечения, вызывая функцию ExcludeClipRect.

Объединить прямоугольную часть рабочей области с текущим регионом отсечения, вызывая функцию IntersectClipRect.

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

Объединить копии текущего региона отсечения со вторым регионом, вызывая функцию CombineRgn.

Сравнить копию текущего региона отсечения со вторым регионом, вызывая функцию EqualRgn.

Определить, находится ли пункт в пределах внутренней области копии текущего региона отсечения, вызывая функцию PtInRegion.