Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.8 Пути

Путь — это набор прямых линий и кривых, хранящийся внутри GDI. Пути (paths) были введены в Windows в версии Windows NT. На первый взгляд пути и регионы могут показаться очень похожими, и, в самом деле, вы можете конвертировать путь в регион и использовать путь для отсечения. Тем не менее, мы рассмотрим их отличия.

4.8.1 Создание и воспроизведение путей

Для того, чтобы начать определение пути, вы просто вызываете функцию:

BeginPath(hdc);

После этого вызова любая рисуемая вами линия (прямая, дуга или сплайн Безье) будет запоминаться внутри GDI как часть пути и не будет воспроизводиться в контексте устройства. Часто пути состоят из связанных друг с другом линий. Для создания связанных линий вы используете функции LineTo, PolylineTo и BezierTo, каждая из которых рисует линию, начинающуюся из текущего положения пера. Если вы изменяете текущее положение пера, используя функцию MoveToEx, или если вы вызываете какую-либо другую функцию рисования линии, или если вы вызываете одну из функций окна или области вывода, влияющих на изменение текущего положения пера, то вы создаете новый подпуть в рамках пути. Таким образом, путь состоит из одного или нескольких подпутей, причем каждый подпуть — это серия связанных линий.

Каждый подпуть в рамках пути может быть открыт или закрыт. Подпуть закрыт, если в нем первая точка первой связанной линии и последняя точка последней связанной линии совпадают. Подпуть закрывается вызовом функции CloseFigure. Эта функция закрывает подпуть, добавляя, если необходимо, прямую линию. Любой последующий вызов функции рисования начинает новый подпуть. В конце вы завершаете определение пути, вызывая функцию:

EndPath(hdc);

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

StrokePath(hdc);

FillPath(hdc);

StrokeAndFillPath(hdc);

hRgn = PathToRegion(hdc);

SelectClipPath(hdc, iCombine);

Любая из этих функций уничтожает определение пути после завершения.

StrokePath рисует путь, используя текущее перо. Вы можете удивиться: в чем смысл? Почему нельзя пропустить все эти штучки с путем, и нарисовать линии нормально? Ответ вы получите очень скоро.

Другие четыре функции закрывают все открытые пути прямыми линиями. Функция FillPath закрашивает путь, используя текущую кисть, в соответствии с текущим режимом закрашивания многоугольников. Функция StrokeAndFillPath выполняет оба указанных действия. Вы можете также преобразовать путь в регион или использовать путь как область отсечения. Параметр iCombine — одна из RGN-констант, используемых в функции CombineRgn, и показывает, как путь должен комбинироваться с текущим регионом отсечения.

Пути являются более гибкими структурами по сравнению с регионами для закрашивания и отсечения, потому что регион может быть определен только как комбинация прямоугольников, эллипсов и полигонов. Пути же могут состоять из сплайнов Безье и дуг. В GDI пути и регионы хранятся совершенно по-разному. Путь — это определение набора прямых и кривых, а регион (в общем смысле) — набор скан-линий.

4.8.2 Расширенные перья

Когда вы вызываете StrokePath, путь воспроизводится с использованием текущего пера. Ранее в этой главе рассматривалась функция CreatePen, которая используется для создания объекта "перо". Одновременно с поддержкой путей в Windows NT введена расширенная функция пера, называемая ExtCreatePen, она применяется, когда бывает удобнее создать сглаженный путь, чем рисовать линии без использования пути.

Функция ExtCreatePen выглядит так:

hPen = ExtCreatePen(iStyle, iWidth, &lBrush, dwStyleCount, &lpStyle);

Два последних параметра используются при iStyle установленном в PS_USERSTYLE. В нашем случае два последних параметра заданы равными 0 и NULL.

Для первого параметра функции ExtCreatePen вы можете использовать любой из стилей, описанных ранее для функции CreatePen. Кроме того, вы можете комбинировать эти стили со стилем PS_GEOMETRIC (при этом параметр iWidth означает ширину линии в логических единицах измерения для преобразования) или PS_COSMETIC (при этом параметр iWidth должен быть равен 1).

Одним из параметров функции CreatePen является цвет; однако, функция ExtCreatePen для задания цвета пера стиля PS_GEOMETRIC использует кисть. Такие кисти могут быть определены как битовые образы.

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

PS_ENDCAP_ROUND

PS_ENDCAP_SQUARE

PS_ENDCAP_FLAT

Аналогично, места соединения линий в пути могут быть заданы так:

PS_JOIN_ROUND

PS_JOIN_BEVEL

PS_JOIN_MITER

Стиль "bevel" отрезает конец места соединения, а стиль "miter" заостряет его. Это лучше всего иллюстрируется программой ENDJOIN.

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

Есть надежда, что теперь вам стало понятно, почему Windows поддерживает функцию StrokePath: Когда вы рисуете две линии отдельно, GDI рисует концы каждой из них. Если же они входят в путь, определенный в GDI, то линии рисуются с местом их соединения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]