D — это Device. В миру: монитор, или принтер, или плоттер, или даже блок памяти (в котором собираются рисовать).
DC — это Device Context. Вспомогательный объект, который система позволяет создавать программистам для собственных целей.
Допустим Device Context-ов бы не было, а нам нужно было бы наприсовть на экране 3 круга и 4 квадрата и 2 линии. Нам пришлось бы вызвать функции Circle, Rectancge и Line,
и при каждом вызове указывать:
- На каком устройстве (монитор, принтер и т.п.) нужно рисовать.
- Координаты опорных точек, по которым рисуется данная фигура
- Цвет линии контура
- Толщина линии контура
- Стиль линии контура (сплошная, пунктир, и т.п.)
- Стиль «законцовок» линий (обрезать под прямым углом, сделать кругляшком, ромбиком и т.п.)
- Стиль «обработки углов» линии контура (плавное сопряжение, сопряжение углом, без сопряжения)
- Цвет внутренней заливки фигуры
- Стиль внутренней заливки фигуры (сплошной, вертикальными линиями, горизонтальными линиями, диагональными, сеткой и т.д.)
- Метод растровой операции (заменить старые пиксели на новые, вычислить новый цвет с помощью And/Or/Xor/ и т.п.)
- Прозрачность (если она поддерживается / бы поддерживалась).
- Регион отсечение — чтобы была возможность не затрагивать своим рисованием то, что не требуется.
В общем, это были бы адовые длиннющие вызовы, длинные и непонятные.
Передавать тысячу параметров при каждом вызове Circle/Rectangle/Line — неудобно. Особенно если Circle/Rectangle/Line сами вызываются 100 раз.
Поэтому придумали так: создаём служебный объект (контекст), и туда записываем всю эту тысячу параметров.
А потом, когда 100 раз вызывает Circle/Rectangle/Line — вместо того, чтобы каждый раз передавать тысячу параметров, передаём один — ссылку на служебный объект (контекст), хранящий все эти параметры.
Кроме того, в контекст добавлены такие фичи как:
- Возможность задать произвольные единицы измерения, и в дальнейшем использовать их при рисовании.
- Возможность задать свою произвольную систему координат, и в дальнейшем использовать её.
Так образом, DC — это информация о том, на каком устройстве рисовать, и о том, какие параметры использовать при рисовании. Это
никакой не контейнер графики, как многие считают. DC не лежат друг в друге, у DC нет Z-order'а. У них нет границ в привичном смысле, зато есть регион отсечения (который может быть произвольной формы) — который определяет область, рисование вне которой «игнорируется». Регионы отсечения разных DC могут пересекаться, накладываться и т.д.
hDC — это хендл DC. Числовое значение, которое однозначно идентифицирует DC в диалоге между программой и системой.