Смекни!
smekni.com

Windows (стр. 3 из 9)

Помимо физических устройств GDI поддерживает логические устройства, или псевдоустройства. Псевдоустройства служат для хранения изображений. В отличие то физических устройств, которые выводят изображения на определенной аппаратной базе, псевдоустройства позволяют "перехватить" образ изображения в оперативной памяти или на диске. GDI поддерживает два типа псевдоустройств: битовые образы и метафайлы.

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

Метафайлы создаются средствами записи-воспроизведения

GDI. С точки зрения расходуемой памяти метафайлы

предпочтительнее, чем битовые образы, однако работа сними

происходит медленнее. Обычно в метафайлах хранятся крупные

изображения.

Логические обьекты графики GDI

Одним из средств достижения аппаратной независимости GDI является использование логических обьектов графики. Такой обьект описывает, каким образом должен выполняться вывод, это высокоуровневый аппаратно-независимый запрос. GDI поддерживает следующие логические обьекты графики:

- перья (для рисования линий);

- кисти (для закрашивания областей);

- шрифты (для вывода текстов);

- логические цвета (описывающие цвета вывода).

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

Контекст устройства

Контекст устройства представляет собой некоторое

множество атрибутов графического вывода, в которое входит одно

перо для рисования линий, одна кисть для закрашивания областей

и один шрифт для вывода текстов, которые можно изменить в

любой момент. Вместе взятые, атрибуты графического вывода дают

полный контроль над тем, как выглядит и где выполняется

графический вывод программы.

Каждый контекст устройства включает в себя 20 атрибутов графического вывода, которые приведены ниже (в скобках приведено значение по умолчанию):

- Цвет фона (белый);

- Режим фона (OPAQUE);

- Логический номер кисти (белая кисть);

- Начало координат кисти (0,0);

- Логический номер области прорисовки (вся поверхность);

- Логический номер цветовой палитры (палитра по умолчанию);

- Текущая позиция пера (0,0);

- Режим графического вывода (R2_COPYPEN);

- Логический номер шрифта (системный шрифт);

- Межсимвольный интервал (0);

- Режим отбражения (MM_TEXT);

- Логический номер пера (черное перо);

- Режим закрашивания многоугольников (альтернативный);

- Режим растяжения (черный по белому);

- Выравнивание границ текста (по левому и верхнему краям);

- Цвет текста (черный для текста и кистей с монохромным

шаблоном закрашивания);

- Выравнивание строк текста (0,0);

- Протяженность окна данного экрана (1,1);

- Начало координат окна данного экрана (0,0);

- Протяженность окна экрана (1,1);

- Начало координат окна экрана (0,0).

Контекст устройства связывает программу с конкретной поверхностью рисования. Такое соединение является логическим, а не физическим. Чтобы избежать конфликтов, связанных с совместным использованием устройств, программа получает у контекста устройства "пропуск" к устройству. Работа системы пропусков зависит от типа устройства. На устройствах получения твердых копий это делается путем буферизации ввода, а на видеоустройствах - путем выделения так называемой области прорисовки, вне границ которой программа рисовать не может.

Основные атрибуты контекста устройства

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

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

Для закрашивания областей используется атрибут кисть, определяющий как будет выглядеть закрашиваемая область и характеризующийся тремя характеристиками: стилем, цветом и шаблоном. Размер кисти составляет 8Х8 пикселей.

При изображении текста ключевым атрибутом является шрифт. Шрифт - совокупность шаблонов для вывода текста. GDI распознает два вида шрифтов: логические и физические.

Логический шрифт описывает текст стандартным не

зависящим от внешних устройств способом. Логический шрифт

задается структурой LOGFONT. Логический шрифт - это запрос на

на текст с определенными характеристиками.

typedef struct tagLOGFONT

int lfHeight; // высотасимвола

int lfWidth; // средняяширина

int lfEscapement; // уголнаклонатекста

int lfOrientation; // уголнаклонасимвола

int lfWeight; // среднеечислопикселей/1000

BYTE lfItalic; // не 0, если курсив

BYTE lfUnderline; // не 0, если подчеркнуто

BYTE lfStrikeOut; // не 0, если вычеркнуто

BYTE lfCharSet; // набор символов ANSI, OEM

BYTE lfOutPrecision; // точнось отображения

BYTE lfClipPrecision; // точность вырезки

BYTE lfQuality; // качество печати

BYTE lfPitchAndFamily; // флаг для стиля шрифта

BYTE lfFaceName[LF_FACESIZE]; // названиешрифта

LOGFONT;

Физический шрифт - это набор шаблонов, зависящий от устройства. Он выбирается по описанию, содержащемуся в логическом шрифте и может быть аппаратно реализован.

Для задания атрибута контекста устройства используется функция SelectObject, описанная следующим образом:

HANDLE FAR PASCAL SelectObject(HDC, HANDLE);

Здесь первый параметр - логический номер контекста устройства, а второй - логический номер значения атрибута.

Для того, чтобы получить логический номер требуемого значения атрибута контекста, используется функция GetStockObject. Ее прототип:

HANDLE FAR PASCAL GetStockObject(int);

Параметром является значение атрибута контекста

устройства, обычно для удобства задаваемое в виде набора

символов.

Программист может использовать либо уже заданные значения атрибутов, либо создавать свои новые.

Перерисовка области и изображение пикселей

Из-за того, что Windows не накладывает ограничений на размеры и расположение окон приложений, могут возникнуть ситуации, что окно одного приложения перекроет окно другого приложения, поэтому при переключении между приложениями необходимо перерисовыть поврежденные области окна.

Для этой цели используется подпрограмма BeginPaint. При получении сообщения WM_PAINT, говорящее о необходимости перерисовки окна из изменения его размеров или восстановления поврежденной области, подпрограмма BeginPaint получает контекст устройства и определяет область, которую надо перерисовать.

Подпрограмма BeginPaint принимает два параметра:

логический номер окна и указатель на структуру данных

PAINTSTRUCT, Она возвращает логический номер контекста устройства, необходимый для рисования пикселя. Прототип подпрограммы имеет вид:

HDC FAR PASCAL BeginPaint(HWND, LPPAINTSTRUCT);

Структура PAINTSTRUCT определенатак:

typedef struct tagPAINTSTRUCT

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[16];

PAINTSTRUCT;

hdc - логический номер контекста устройства;

fErase - флаг, задающий необходимость стирания окна; rcPaint - описывает прямоугольник, ограничивающий

поврежденную область;

fRestore, fIncUpdate и rgbReserved предназначены для внутреннего использования Windows.

Для отображения пикселя используется подпрограмма

SetPixel. Еепрототип:

DWORD FAR PASCAL SetPixel( HDC, int, int, DWORD);

HDC - логический контекст устройства; следующие два параметра - координаты пикселя; последний параметр - цвет.

После завершения перерисовки, программа вызывает функцию EndPaint, чтобы вернуть контекст устройства дисплея Менеджеру Окон и сообщить, что окно восстановлено. Когда тот получает контекст устройства, он восстанавливает все его атрибуты по умолчанию, и контекст устройства готов к передаче информации любой программе, которой понадобится нарисовать окно. Подпрограмма EndPaint имеетпрототип:

void FAR PASCAL EndPaint(HWND, LPPAINTSTRUCT);

Рисование линий

Каждая линия имеет начальную и конечную точку, и GDI рисует линию так, начальная точка включается в линию, а конечная исключается из линии.

GDI имеет 4 подпрограммы для рисования линий: MoveTo, LineTo, PolyLine и Arc.

Подпрограмма MoveTo помещает пару координат XY в атрибут контекста устройства, который называется текущей позицией. Подпрограммаимеетпрототип:

DWORD FAR PASCAL MoveTo( HDC, int x1, int y1 );

Подпрограмма LineTo берет начальную точку из атрибута текущей позиции и рисует линию до конечной точки, передаваемой как параметр. После этого она устанавливает новое значение атрибута текущей позиции. Подпрограмма имеет прототип:

BOOL FAR PASCAL LineTo( HDC, int x1, int y1 );

Подпрограмма Polyline позволяет нарисовать ломанную линию, но для ее работы необходимо предварительно создать массив координат точек. Подпрограммаимеетпрототип:

BOOL FAR PASCAL Polyline( HDC, LPPOINT points, int num );

points - указатель на массив координат, котором координаты оси абсцисс и оси ординат чередуются; num - число пар координат в массиве.

Подпрограмма Arc позволяет нарисовать дуги эллипса. Передаваемые параметры определяют прямоугольник, ограничивающий фигуру, если бы она была полной, начальную точку и конечную. Подпрограммаимеетпрототип:

BOOL FAR PASCAL Arc( HDC,int,int,int,int,int,int,int,int);

Рисование закрашенных фигур

Для рисования закрашенных фигур существует семь

различных функций.

Функция Polygon соединяет расположенные последовательно точки с помощью текущего установленного в контексте устройства пера. Функцияопределенатак:

BOOL FAR PASCAL Polygon(HDC, LPPOINT, int);

HDC - логический номер контекста устройства;