Краткие теоретические сведения

GDI (Graphics Device Interface) представляет собой единый унифициро­ванный интерфейс устройств (средств) отображения графической информации в Windows. Работа GDI базируется на понятии контекста устройства (device context – DC), который абстрагирует свойства реальных устройств: экран (окно на экране), принтер, битовый образ в памяти и так далее. Контекст идентифицируется его описателем, тип HDC (handle DC).

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

Для получения контекста служат функции: GetDC(), GetWindowDC(), GetDCEx(). Они применимы для оконных (экранных) контекстов. Функции CreateDC() и CreateCompatibleDC() создают контексты, связанные с иными (не окна) объектами либо «контексты в памяти», не связанные с реальным устройством. Освобождение контекстов выполняется функциями ReleaseDC() для оконных и DeleteDC() для остальных.

Для формирования изображения в контексте служат функции графи­ческих примитивов (например, Ellipse(), DrawText() и так далее) и графические инструменты. Основными инструментами (объектами) являются: «перо» (Pen), «кисть» (Brush) и «шрифт» (Font). Логика GDI такова, что система при отображении примитива сама выбирает соответствующий инструмент: например, при изображении закрашенного полигона текущее «перо» будет использовано для отрисовки его контура, а текущая «кисть» — для внутренней области.

Объекты типа Bitmap или Metafile сами способны хранить изображение, поэтому могут служить «рабочей поверхностью» контекста. Объекты «палитра», «область отсечения» и некоторые другие дополнительно влияют на формирование изображения.

Для создания инструментов служат соответствующие функции GDI API, например CreatePen(), CreateBrush() и так далее. Для сложных объектов может быть определено несколько функций, различающихся параметрами и получа­емым эффектом.

Контекст может иметь только по одному активному объекту каждого вида. Для их переключения служит функция SelectObject(), которая принимает экземпляр объекта (инструмента) и делает его текущим в заданном контексте; тип объекта определяется автоматически, и предыдущий объект этого типа выталкивается из контекста.

Общая схема отрисовки следующая:

– получение контекста;

– установка набора инструментов;

– формирование изображения из примитивов, в том числе со сменой используемых инструментов;

– освобождение контекста.

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

В типичном случае перерисовка содержимого окна инициируется сообщением WM_PAINT — оно сигнализирует, что текущее видимое содержимое в окне было разрушено, и система уже выполнила автоматическую перерисовку самого окна и его фона.

Контрольные вопросы

1) Контексты графических устройств.

2) Как можно осуществить рисование на окне.

3) Что такое активные Pen и Brush. Каким образом они могут быть созданы и активированы. Параметры функций создания Pen и Brush.

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

5) Каким образом может быть нарисован Polyline.

6) Самоотрисовывающаяся кнопка (OWNERDRAW). Как она может быть создана, как на ней рисовать собственный рисунок и как обрабатывать нажатия на такие кнопки.