Контуры в GDI+
Обновлен: Ноябрь 2007
Контуры формируются из прямых линий, прямоугольников и простейших кривых. В разделе Общие сведения о векторной графике мы уже писали, что были выделены следующие элементы, которые больше всего подходят для рисования изображений:
Прямые линии
Прямоугольники
Эллипсы
Дуги
Многоугольники
Фундаментальные сплайны
Сплайны Безье
Объект GraphicsPath интерфейса GDI+ позволяет собирать последовательность таких элементов в одно целое. После этого вся последовательность линий, прямоугольников, многоугольников и кривых может быть нарисована путем однократного вызова метода DrawPath класса Graphics. На приведенном ниже рисунке изображен контур, созданный путем соединения отрезка прямой, дуги, сплайна Безье и основного сплайна.
Применение контуров
Класс GraphicsPath содержит следующие методы для рисования последовательностей элементов приведенного выше списка: AddLine (прямые линии), AddRectangle (прямоугольники), AddEllipse (эллипсы), AddArc (дуги), AddPolygon (многоугольники), AddCurve (фундаментальные сплайны) и AddBezier (сплайны Безье). Каждый из этих методов перегружен, это значит, что каждый метод может получать различные наборы параметров. Например, один вариант метода AddLine получает четыре целых числа, а другой вариант метода AddLine получает два целых числа и объект Point.
Помимо перечисленных ранее методов для рисования линий, прямоугольников и сплайнов Безье существуют вспомогательные методы, выполняющие добавление к контуру нескольких элементов за один вызов: AddLines, AddRectangles и AddBeziers. Для методов AddCurve и AddArc также существуют вспомогательные методы AddClosedCurve и AddPie, позволяющие добавлять к контуру замкнутую кривую или сектор.
Чтобы нарисовать контур, нужно создать объекты Graphics, Pen и GraphicsPath. У объекта Graphics имеется метод DrawPath, а объект Pen предназначен для хранения таких атрибутов, как ширина и цвет линии, с помощью которой рисуется контур. Объект GraphicsPath служит хранилищем для последовательности прямых и кривых линий, составляющих путь. Объекты Pen и GraphicsPath передаются в качестве аргументов методу DrawPath. Приведенный ниже пример демонстрирует рисование контура, состоящего из отрезка прямой, эллипса и сплайна Безье.
myGraphicsPath.AddLine(0, 0, 30, 20)
myGraphicsPath.AddEllipse(20, 20, 20, 40)
myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10)
myGraphics.DrawPath(myPen, myGraphicsPath)
myGraphicsPath.AddLine(0, 0, 30, 20);
myGraphicsPath.AddEllipse(20, 20, 20, 40);
myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10);
myGraphics.DrawPath(myPen, myGraphicsPath);
На приведенном ниже рисунке изображен полученный контур.
Кроме отрезков, прямоугольников и кривых к контуру можно добавлять другие контуры. Это позволяет объединять существующие контуры и создавать большие и сложные контуры.
myGraphicsPath.AddPath(graphicsPath1, False)
myGraphicsPath.AddPath(graphicsPath2, False)
myGraphicsPath.AddPath(graphicsPath1, false);
myGraphicsPath.AddPath(graphicsPath2, false);
К контуру можно также добавлять еще два элемента: строку и сектор. Сектор — это часть внутренней области эллипса. В приведенном ниже примере демонстрируется создание контура из дуги, фундаментального сплайна, строки и сектора.
Dim myGraphicsPath As New GraphicsPath()
Dim myPointArray As Point() = { _
New Point(5, 30), _
New Point(20, 40), _
New Point(50, 30)}
Dim myFontFamily As New FontFamily("Times New Roman")
Dim myPointF As New PointF(50, 20)
Dim myStringFormat As New StringFormat()
myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180)
myGraphicsPath.StartFigure()
myGraphicsPath.AddCurve(myPointArray)
myGraphicsPath.AddString("a string in a path", myFontFamily, _
0, 24, myPointF, myStringFormat)
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110)
myGraphics.DrawPath(myPen, myGraphicsPath)
GraphicsPath myGraphicsPath = new GraphicsPath();
Point[] myPointArray = {
new Point(5, 30),
new Point(20, 40),
new Point(50, 30)};
FontFamily myFontFamily = new FontFamily("Times New Roman");
PointF myPointF = new PointF(50, 20);
StringFormat myStringFormat = new StringFormat();
myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);
myGraphicsPath.StartFigure();
myGraphicsPath.AddCurve(myPointArray);
myGraphicsPath.AddString("a string in a path", myFontFamily,
0, 24, myPointF, myStringFormat);
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);
myGraphics.DrawPath(myPen, myGraphicsPath);
На приведенном ниже рисунке изображен полученный контур. Обратите внимание, что компоненты контура не обязаны быть связанными — дуга, фундаментальный сплайн, строка и сектор отделены друг от друга.
См. также
Задачи
Практическое руководство. Создание объектов Graphics для рисования
Ссылки
System.Drawing.Drawing2D.GraphicsPath