Краткие теоретические сведения. GDI (Graphics Device Interface) представляет собой единый унифициро­ванный интерфейс устройств (средств) отображения графической информации в Windows

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.

Наши рекомендации