Чтение онлайн

ЖАНРЫ

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

Помните о том, что вдобавок к типу Pen в GDI+ предлагается коллекция Pens. Используя ряд статических свойств, вы можете извлечь из этой коллекции объект Pen (или нужный цвет) "на лету", не создавая пользовательский тип Pen вручную. Однако следует знать, что возвращаемый: при этом тип Pen всегда имеет ширину, равную 1.

Если вам понадобятся какие-то экзотические перья, вы должны создать тип Pen вручную. Предоставив вам эту информацию, я теперь могу перейти к построению примеров геометрических изображений с помощью простых типов Pen. Предположим, что у нас есть главный объект Form, способный отвечать на запросы визуализации. Реализация ответа выглядит так.

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g= e.Graphics;

 //
Создание большого пера синего цвета.

 Pen bluePen = new Pen(Color.Blue, 20);

 // Получение готового пера из типа Pens.

 Pen pen2 = Pens.Firebrick;

 // Визуализация некоторых шаблонов.

 g.DrawEllipse(bluePen, 10, 10, 100, 100);

 g.DrawLine(pen2, 10, 130, 110, 130);

 g.DrawPie(Pens.Black, 150, 10, 120, 150, 90, 80);

 // Рисование пурпурного полигона с пунктирной границей.…

 Pen pen3 = new Pen(Color.Purple, 5);

 pen3.DashStyle = DashStyle.DashDotDot;

 g.DrawPolygon(pen3, new Point[] { new Point(30, 140), new Point(265, 200), new Point(100, 225), new Point(190, 190), new Point(50, 330), new Point(20, 180) });

 //… и прямоугольника, содержащего текст.…

 Rectangle r = new Rectangle (150, 10, 130, 60);

 g.DrawRectangle(Pens.Blue, r);

 g.DrawString("Эй, вы, там, наверху!… Я вам привет передаю.", new Font("Arial", 11), Brushes.Black, r);

}

Заметьте, что тип Pen, применяемый для отображения многоугольника, использует перечень DashStyle (определенный в System.Drawing.Drawing2D).

public enum DashStyle {

 Solid, Dash, Dot,

 DashDot, DashDotDot, Custom

}

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

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 …

 // Рисование прерывистой линии вдоль границы формы

 // по пользовательскому шаблону.

 Pen customDashPen = new Pen(Color.BlueViolet, 10);

 float[] myDashes = {5.0f, 2.0f, 1.0f, 3.0f};

 customDashPen.DashPattern = myDashes;

 g.DrawRectangle(customDashPen, ClientRectangle);

}

На рис. 20.12 показан вывод этого варианта обработчика событий Paint.

Исходный код. Проект CustomPenApp размещен в подкаталоге, соответствующем главе 20.

Рис. 20.12. Работа с типами Pen

Концы

линий

Если рассмотреть вывод предыдущего примера, вы должны заметить, что начало и конец каждой линии там оформлен вполне стандартно – линия "срезается" под углом 90° к ее направлению. Но, используя перечень LineCap, вы имеете возможность создавать объекты Pen, демонстрирующие иное поведение.

public enum LineCap {

 Flat, Square, Round,

 Triangle, NoAnchor,

 SquareAnchor, RoundAnchor,

 DiamondAnchor, ArrowAnchor,

 AnchorMask, Custom

}

Следующее приложение отображает набор линий, по очереди используя каждый из стилей LineCap. Конечный результат показан на рис. 20.13.

Рис. 20.13. Работа с концами линий

В соответствующем программном коде просто используется цикл по всем членам перечня LineCap с выводам имени соответствующего элемента (например, ArrowAnchor) и отображением линии с соответствующим оформлением ее концов.

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 Pen thePen = new Pen(Color.Black, 10);

 int yOffSet = 10;

 // Получение всех членов перечня LineCap.

 Array obj = Enum.GetValues(typeof(LineCap));

 // Рисование линии для данного члена LineCap.

 for (int х = 0; х ‹ obj. Length; x++) {

// Получение следующего стиля конца линии и настройка пера.

LineCap temp = (LineCap)obj.GetValue(x);

thePen.StartCap = temp;

thePen.EndCap = temp;

// Вывод имени из перечня LineCap.

g.Drawstring(temp.ToString, new Font("Times New Roman", 10), new SolidBrush(Color.Black), 0, yOffSet);

// Рисование линии с соответствующим стилем концов.

g.DrawLine(thePen, 100, yOffSet, Width – 50, yOffSet);

yOffSet += 40;

 }

}

Исходный код. Проект PenCapApp размещен в подкаталоге, соответствующем главе 20.

Работа с типами Brush

Типы, производные от System.Drawing.Brush, используются для заполнения имеющегося региона заданным цветом, узором или изображением. Сам класс Brush является абстрактным типом, поэтому он не позволяет создать соответствующий экземпляр непосредственно. Однако Brush может играть роль базового класса для родственных ему типов кисти (например, SolidBrush, HatchBrush, LinearGradientBrush и т.д.). Кроме относящихся к Brush типов, пространство имей System.Drawing определяет также два вспомогательных класса, возвращающие кисти, уже сконфигурированные с помощью ряда статических свойств: это классы Brushes и SystemBrushes. Так или иначе, получив кисть, вы получаете возможность вызвать любой из методов FillXXX типа Graphics.

Поделиться с друзьями: