Контексты устройств и графический объект

В GDI способ, с помощью которого определяется тип устройства для вывода информации, основан на использовании объекта, известного как контекст устройства (device context (DC)). Контекст устройства хранит информацию о конкретном устройстве и способен пееревести вызовы GDI API функций в инструкции, отсылаемые на это устройство. Можно запросить у контекста устройства информацию о том, какими возможностяхми обладает соответствующее устройство (например, возможно цветное распечатывание или только черно-белое) и установить нужные характеристики. Если запросить усстройство сделать что-либо, чего оно не может выполнить, то контекст устройства обнаружит это и, в зависимости от ситуации, предпримет соответствуюшие действия, выбрасывая исключение или изменяя сам запрос на наиболее ближайшее по смыслу действие.

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

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

В GDI+ продолжается использование контекста устройства, но теперь оно приобретает более дружественное название. Оно заимствовано из базовых .NET классов и известно как Graphics. Можно легко увидеть, что основная доля рисования осуществляется с помощью объекта Graphics. На самом деле, поскольку класс System.Drawing.Graphics - это класс, предназначенный для управления большинством операций, связанных с рисованием. Понимание того, как манипулировать этим объектом представляется ключевым моментом в понимании характерных особенностей рисования с помощью GDI+.