Поделиться через


Контуры в 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

System.Drawing.Point

Другие ресурсы

Прямые и кривые линии и фигуры

Построение и рисование контуров