netlib.narod.ru< Назад | Оглавление | Далее >

Создание контура

У класса GraphicsPath шесть конструкторов:


Конструкторы GraphicsPath



GraphicsPath()
GraphicsPath(Point[] apt, byte[] abyPointType)
GraphicsPath(PointF[] aptf, byte[] abyPointType)
GraphicsPath(FillMode fm)
GraphicsPath(Point[] apt, byte[] abyPointType, FillMode fm)
GraphicsPath(PointF[] aptf, byte[] abyPointType, FillMode fm)


Если аргумент FillMode не задан, по умолчанию принимается значение FillMode.Alternate.

Как видно из определения четырех из этих конструкторов, контур может быть создан при помощи массива структур Point или PointF и набора соответствующих значений перечисления PathPointType, заданных в виде массива значений типа byte. Но маловероятно, что программа начнет создавать контур таким способом. Вместо этого эти конструкторы более удобно использовать для изменения значений PathPoints существующего контура.

Обычно новый контур создают при помощи конструктора по умолчанию:

  GraphicsPath path = new GraphicsPath();

Затем можно вызывать методы класса GraphicsPath чтобы добавлять к контуру прямые или кривые. Эти методы аналогичны соответствующим методам класса Graphics за исключением того, что их имена начинаются с префикса Add вместо Draw и у них нет аргумента Pen.

Вот методы объекта GraphicsPath, добавляющие к текущей фигуре прямые, кривые Безье, дуги и канонические сплайны. Аргументы методов не показаны, так как они в основном те же, что у соответствующих методов с префиксом Draw, определенных в классе Graphics.


Методы GraphicsPath (выборочно)



void AddLine(...)
void AddLines(...)
void AddArc(...)
void AddBezier(...)
void AddBeziers(...)
void AddCurve(...)


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

Если path — это объект типа GraphicsPath, следующие три вызова добавят к контуру три соединенных линии:

  path.AddLine(0, 0, 0, 100);
  path.AddLine(0, 100, 100, 100);
  path.AddLine(100, 100, 100, 0);

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

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

  path.AddLine(0, 0, 0, 100);
  path.AddLine(100, 100, 100, 0);

Поскольку первая линия заканчивается в точке с координатами (0, 100), а вторая начинается в точке (100, 100), контур добавляет линию, соединяющую эти две точки.

Можно использовать и следующие три метода:


Методы GraphicsPath (выборочно)



void StartFigure()
void CloseFigure()
void CloseAllFigures()


Каждый из них завершает текущую фигуру и начинает новую, a CloseFigure еще и закрывает текущую фигуру. При необходимости к контуру автоматически добавляется прямая, соединяющая первую и последнюю точки завершаемой фигуры. Метод CloseAllFigures закрывает все фигуры, составляющие контур в данный момент.

Вызовы:

  path.AddLine(0, 0, 0, 100);
  path.AddLine(0, 100, 100, 100);
  path.AddLine(100, 100, 100, 0);
  path.AddLine(100, 0, 0, 0);
  path.CloseFigure();

явно создают закрытую фигуру квадратной формы. Вызовы:

  path.AddLine(0, 0, 0, 100);
  path.AddLine(100, 100, 100, 0);
  path.CloseFigure();

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

  path.AddLine(0, 0, 0, 100);
  path.AddLine(0, 100, 100, 100);
  path.AddLine(100, 100, 100, 0);
  path.AddLine(100, 0, 0, 0);
  path.StartFigure();

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

Следующие методы начинают новую фигуру, которая затем закрывается:


Методы GraphicsPath (выборочно)



void AddRectangle(...)
void AddRectangles(...)
void AddPolygon(...)
void AddEllipse(...)
void AddPie(...)
void AddClosedCurve(...)


Например, вызовы:

  path.AddLine(0, 0, 100, 0);
  path.AddRectangle(new Rectangle(50, 50, 100, 100));
  path.AddLine(200, 0, 0, 0);

создают три подконтура:

Контуры также можно добавлять друг к другу:


Метод AddPath класса GraphicsPath



void AddPath(GraphicsPath path, bool bConnect)


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

Методы AddString добавляют к контуру текстовую строку. Синтаксис этих методов заметно отличен от синтаксиса методов DrawString.


Методы AddString класса GraphicsPath



void AddString(string str, FontFamily ff, int iStyle, float fSize,
               Point pt, StringFormat sf)
void AddString(string str, FontFamily ff, int iStyle, float fSize,
               PointF ptf, StringFormat sf)
void AddString(string str, FontFamily ff, int iStyle, float fSize,
               Rectangle rect, StringFormat sf)
void AddString(string str, FontFamily ff, int iStyle, float fSize,
               RectangleF rectf, StringFormat sf)


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

На самом деле аргументы метода AddString не столь эксцентричны, как можно предположить из определения метода. Третий аргумент определяется как значение типа int, но реально это член перечисления FontStyle (Regular, Bold, Italic, Underline или Strikeout). Второй, третий и четвертый аргументы те же, что у конструктора объекта Font.

Но почему бы методам AddString не использовать аргументы типа Font, как это делают методы DrawString? Дело в том, что для объекта Font обычно уже задан определенный размер символов шрифта, а контур не сохраняет сведений о размерах. Аргумент fSize метода AddString задает вовсе не размер символов шрифта в пунктах. Определение аргумента fSize у метода AddString аналогично созданию объекта Font с размером, выраженным в пикселах, и аргументами GraphicsUnit.Pixel или GraphicsUnit.World (см. главу 9). До визуализации текст не содержит сведений о своих размерах.

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

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


Методы GraphicsPath (выборочно)



void SetMarkers()
void ClearMarkers()


Позже можно выполнять поиск этих маркеров при помощи класса GraphicsPathIterator. Это средство облегчает редактирование контура.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz