Главная » Win32 API » Описание инструментов рисования

0

Как было отмечено выше, к графическим объектам, обеспе­чивающим выполнение графических операций, относятся перья, кисти, растровые изображения, палитры, шрифты. Рассмотрим общий алго­ритм работы с инструментами рисования:

а) создать новый инструмент с заданными характеристиками с по­
мощью функций Create… (например, CreatePen (перо)) и запомнить
его дескриптор;

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

в) использовать новый инструмент для вывода изображения или
текста;

г)  выбрать в контекст устройства сохраненный дескриптор инстру­
мента по умолчанию;

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

Выбор инструментов и рисование осуществляются при обработке WMPAINT, когда уже известен контекст устройства после отработки BeginPaint. Так как в контексте устройства хранится только один де­скриптор инструмента рисования, то при смене кисти или пера в про­цессе рисования необходимо загружать в контекст дескрипторы тре­буемых инструментов по мере надобности. Сохранять при этом нужно только дескриптор инструмента по умолчанию, чтобы его можно было восстановить в контексте перед вызовом функции EndPaint.

Удаление созданных инструментов, как правило, реализуется при обработке сообщения WMDESTROY, хотя можно создавать и уда­лять инструменты при обработке сообщения WMPAINT.

Отметим, что в Windows предусмотрен стандартный набор кистей, перьев и шрифтов, которые могут быть использованы в программе. Их дескрипторы создавать и уничтожать не нужно, их нужно затребовать для использования функцией GetStockObject и затем загрузить в кон­текст.

Любая функция рисования линий и кривых, а также контуров замк­нутых фигур использует перо (реп), дескриптор которого хранится в контексте устройства в данный момент. По умолчанию используется перо BLACKPEN. Оно рисует сплошные черные линии толщиной 1 пиксел независимо от режима отображения. Кроме черного пера суще­ствует стандартное белое перо с шириной в 1 пиксел (WHITEPEN), невидимое перо для вывода фигур без контура (NULLPEN). Для ри­сования линий разного цвета, толщины и стиля GDI позволяет созда­вать логические перья. Логическое перо имеет дескриптор типа HPEN (handle to a pen). Будем рассматривать так называемые простые перья. Для них не сплошные линии можно рисовать только толщиной 1 пик­сел, а сплошные линии могут иметь любую толщину, но закругленные окончания.

Для получения дескриптора простого пера вызываются функция CreatePen или CreatePenlndirect Функция CreatePen имеет три па­раметра:

1.                    Стиль пера, определяющий порядок следования пикселов и расположение линии. Возможные значения этого параметра приведе­ны в таблице 2.1.

Толщина линии в логических единицах. Если в контексте устройства используется режим отображения по умолчанию ММТЕХТ, то логические единицы совпадают с физическими едини­цами и выражаются в пикселах. Если логические единицы не совпадают с физическими, то физическая толщина пера устанавливается в со­ответствии с масштабом, и толщина пера будет одинаковой только в том случае, когда масштабы по обеим осям одинаковы. Если второй параметр равен нулю, то толщина принимается равной 1 пикселу неза­висимо от режима отображения.

Таблица 2.1

Стиль

Вид линии

Выравнива­ние

Ограниче­ния на толщину

PS SOLID

Сплошная

По центру

Нет

PS DASH

Пунктирная

По центру

<=1

PS DOT

Точечная

По центру

<=1

PS_DASHDOT

Пунктирно-точечная

По центру

<=1

PS_DASHDOTDOT

Отрезок и две точки

По центру

<=1

PS_NULL

Не рисуется

PSJNSIDEFRAME

Сплошная

Внутри кон­тура

>1

3. Цвет пера, имеющий тип COLORREF. Обычно это значение задается либо с помощью макроса RGB, либо с помощью макроса PALETTERGB. Первый вариант используется, если устройство вывода поддерживает полный диапазон цветов, определяемый 24-битным RGB-значением. Аргументами макроса являются интенсивности крас­ной, зеленой и синей компонент цвета. Второй вариант (макрос PALETTERGB) необходимо использовать, если приложение работает с логической палитрой, например, для моделей дисплеев, которые под­держивают только 256 цветов. В последнем случае система Windows преобразует запрошенный RGB-цвет в наиболее близкий цвет из па­литры.

Получение дескриптора пера с помощью CreatePenlndirect требу­ет заполнения структуры типа LOGPEN, включающей поля, описы­вающие стиль, толщину и цвет пера.

После создания дескриптора пера с требуемыми параметрами его необходимо загрузить в контекст устройства с помощью функции Se-lectObject. Для рисования простейших геометрических фигур можно использовать следующие функции:

MoveToEx перемещение текущей позиции пера в точку (х,у). Параметры дескриптор контекста устройства, х-координата новой текущей позиции, у-координата новой текущей позиции, предыдущая позиция пера. По умолчанию текущая позиция пера установлена в точку (0,0);

GetCurrentPositionEx получение текущей позиции пера. Пара­метры hDC дескриптор контекста устройства, адрес переменной pt типа POINT;

LineTo рисование отрезка, начиная с точки, в которой находится текущая позиция пера, до точки (xEnd, yEnd), не включая ее в отрезок. Параметры дескриптор контекста устройства, xEnd х-координата конечной точки, yEnd у-координата конечной точки;

Polyline рисование ломаной линии. Параметры hDC, адрес массива точек, количество точек. Функция Polyline не использует те­кущую позицию пера и не изменяет ее;

-  Дуги рисуются как часть эллипса. Размеры и расположение эл­липса определяются ограничивающим прямоугольником. Ограничи­вающий прямоугольник задается координатами левой верхней (xLeft, уТор) и правой нижней (xRight, yBottom) вершин. Центром эллипса является точка (хО, уО), где xO=xLeft + (xRight xLeft)/2, a y0= уТор + (yBottom уТор)/2. Для рисования дуг предназначены функции Arc, ArcTo и AngleArc. В качестве параметров помимо координат точек, задающих эллипс, им передаются координаты начальной и конечной точек дуги;

Отметим, что существует функция вывода одного пиксела SetPixel, однако подобный способ рисования был бы очень медленным.

Все функции рисования, рассмотренные выше, рисуют незамкну­тые фигуры. Однако хотелось бы иметь возможность рисовать замкну­тые фигуры и закрашивать их внутренние области. Для этой цели ис­пользуется кисть. Кисть представляет собой картинку размером 8*8 пикселов, которая при закрашивании дублируется по горизонтали и вертикали. К стандартным кистям относятся BLACKBRUSH (черная), DKGRAYBRUSH (темно-серая), GRAYBRUSH (серая), LTGRAYBRUSH (светло-серая) WHITEBRUSH (белая, использует­ся по умолчанию), NULLBRUSH (пустая, без заливки), DCBRUSH (сплошная цветная, по умолчанию белая, другой цвет после вызова SetDCBrushColor). Дескрипторы всех стандартных кистей запраши­ваются по GetStockObject

Для получения дескриптора нестандартной кисти используются следующие функции:

1.    CreateSolidBrush однотонная кисть. Параметр цвет, формируемый RGB или PALETTERGB;

2.               CreateHatchBrush штриховая кисть. Параметры стиль штриховки  (HS_HORIZONTAL,       HS_VERTICAL, HS_BDIAGONAL, HS_CROSS и т.д.), цвет.

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

Для создания кисти любого типа можно использовать функцию CreateBrushlndirect

Рисование замкнутых фигур осуществляется с помощью функций:

- Rectangle, FillRect, FrameRect, InvertRect и DrawFocusRect -прямоугольник;

- Ellipse эллипс;

- Chord хорда;

- Pie сектор эллипса;

- RoundRect прямоугольник с закругленными углами;

- Poligon многоугольник.

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии