GDI (Graphics Device Interface) представляет собой единый унифицированный интерфейс устройств (средств) отображения графической информации в Windows. Работа GDI базируется на понятии контекста устройства (device context – DC), который абстрагирует свойства реальных устройств: экран (окно на экране), принтер, битовый образ в памяти и так далее. Контекст идентифицируется его описателем (тип handle DC – HDC).
Получив контекст, программа может обращаться к нему с единым набором функций, причем поведение контекста (изображения контекста) должно быть одинаковым независимо от того, с каким устройством он связан.
Для получения контекста служат функции: 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). Как она может быть создана, как на ней рисовать собственный рисунок и как обрабатывать нажатия на такие кнопки.
Задание
Написать программу, которая создает окно с двумя элементами управления типа самоотрисовывающейся кнопки (OWNERDRAW), для каждой из которых должен быть задан какой-нибудь рисунок. При нажатии на первую из них в окне выводится рисунок, состоящие не менее чем из двадцати графических примитивов (линия, дуга, полигон, прямоугольник, эллипс – каждый из перечисленных примитивов должен быть использован хотя бы два раза). Вторая из кнопок должна стирать данный рисунок.
Лабораторная работа №9
Динамичесое отображение данных на окне
Цели работы:
1) изучить возможности графической подсистемы.
2) научиться использовать расширенные возможности графики GDI.