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

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

□ Кисть

System.Drawing.Drawmg2D.PathGradientBrush
действует аналогично, но в этом случае цвет меняется вдоль кривой в закрашиваемой области. Мы не будем рассматривать здесь эти кисти. Отметим только, что обе они могут создать интересные эффекты при аккуратном использовании. Пример
Bezier
из главы 9 использует кисть с линейным градиентом для закрашивания фона окна.

Перья

В отличие от кистей перья представлены только одним классов —

System.Drawing.Pen
. Перо в действительности является немного более с южным, чем чисть, так как оно должно указывать толщину линий (ширину в пикселях), а для широкой линии,— как закрашивать область внутри нее. Перья могут также определять ряд других свойств, которые находятся за пределами нашего рассмотрения, но включают
упоминавшееся ранее свойство
Alignment
, указывающее, где относительно границы фигуры должна быть нарисована линия, а также какую фигуру нарисовать в конце линии (нужно ли округлять форму).

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

Brush
. Это достаточно мощное средство, так как при его содействии можно нарисовать линии, окрашенные с помощью штрихования или линейного затенения. Существует четыре различных способа, с помощью которых создаются экземпляры
Pen
. Можно задать цвет или кисть, оба эти конструктора будут создавать перо шириной в один пиксель. Можно также в дополнение к цвету или кисти задать значение типа
float
, представляющее ширину пера (на тот случай, если для объекта
Graphics
, который будет выполнять рисование, используются нестандартные единицы измерения, такие как миллиметры или дюймы, или доли дюймов). Поэтому, например, можно так создавать перья:

Brush brickBrush = new HatchBrush(HatchStyle.DiagonalBrick, Color.DarkGoldenrod, Color.Cyan);

Pen solidBluePen = new Pen(Color.FromArgb(0, 0, 255));

Pen solidWideBluePen = new Pen(Color.Blue, 4);

Pen brickPen = new Pen(BrickBrush);

Pen brickWidePen = new Pen(BrickBrush, 10);

Кроме того, для быстрого создания перьев можно использовать класс

System.Drawing.Pens
, который подобно классу
Brushes
содержит ряд готовых перьев. Эти перья все имеют ширину в один пиксель и используют обычное множество именованных цветов Интернета, что позволяет создавать перья таким образом:

Pen SolidYellowPen = Pens.Yellow;

Рисование фигур и линий

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

System.Drawing.Graphics
имеет большое число методов, позволяющих рисовать различные линии, контуры фигур и сплошные фигуры. Их существует слишком много, но таблица (см. ниже) представляет основные методы и дает представление о множестве фигур, которые можно нарисовать.

Метод Типичные параметры Что рисует
DrawLine
Перо, начальная и конечная точки Одиночная прямая линия
DrawRectangle
Перо, позиция и размер Контур прямоугольника
DrawEllipse
Перо, позиция и размер Контур эллипса
FillRectangle
Кисть, позиция и размер Закрашенный прямоугольник
FillEllipse
Кисть, позиция и размер Закрашенный эллипс
DrawLines
Перо, массив точек Последовательность линий, соединяющих каждую точку в массиве со следующей
DrawBezier
Перо, 4 точки Гладкая кривая, соединяющая две конечные точки и проходящая через две оставшиеся точки, используемые для управления формой кривой
DrawCurve
Перо,
массив точек
Гладкая кривая, проходящая через точки
DrawArc
Перо, прямоугольник, два угла Часть окружности внутри прямоугольника, определенная углами
DrawClosedCurve
Перо, массив точек Подобен
DrawCurve
, но рисует также прямую линию для соединения концов кривой
DrawPie
Перо, прямоугольник, два угла Клиновидный контур внутри прямоугольника
FillPie
Кисть, прямоугольник, два угла Закрашенная клиновидная область в прямоугольнике
DrawPolygon
Перо, массив точек Подобен
DrawLines
, но соединяет также первую и последнюю точки для замыкания нарисованной фигуры

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

ScrollMoreShapes
и является по сути пересмотром примера
ScrollShapes
. Помимо прямоугольника и эллипса, добавим толстую линию и закрасим фигуры с помощью различных кистей. Мы уже объясняли принципы рисования, поэтому код представлен с минимальными комментариями. Первое: в связи с новыми кистями, нам нужно указать, что используется пространство имен
System.Drawing.Drawing2D
:

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

Используем несколько дополнительных полей в классе

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

private Rectangle rectangleBounds =

 new Rectangle(new Point(0, 0), new Size(200, 200));

private Rectangle ellipseBounds =

 new Rectangle(new Point(50, 200), new Size(200, 150));

private Pen BluePen = new Pen(Color.Blue, 3);

private Pen RedPen = new Pen(Color.Red, 2);

private Brush SolidAzureBrush = Brushes.Azure;

private Brush CrossBrush = new HatchBrush(HatchStyle.Cross, Color.Azure);

static private Brush BrickBrush =

 new HatchBrush(HatchStyle.DiagonalBrick, Color.DarkGoldenrod, Color.Cyan);

private Pen BrickWidePen = new Pen(BrickBrush, 10);

Поле

BrickBrush
объявлено как статическое, чтобы использовать его значение в инициализаторе
BrickWidePen
, который далее следует. C# не позволит использовать поле одного экземпляра объекта для инициализации поля другого экземпляра, так как не определено, какое из них будет инициализировано первым. Но объявление поля как static решает проблему, так как создается только один экземпляр класса
Form1
, поэтому неважно, будут ли поля статическими или полями экземпляра. Вот метод
OnPaint
:

protected override void OnPaint(PaintEventArgs e ) {

 Graphics dc = e.Graphics;

 Point scrollOffset = this.AutoScrollPosition;

 dc.TranslateTransform(scrollOffset.X, scrollOffset.Y);

 if (e.ClipRectangle.Top+scrollOffset-X < 350 ||

e.ClipRectangle.Left+scrollOffset.Y < 250) {

dc.DrawRectangle(BluePen, rectangleBounds);

dc.FillRectangle(CrossBrush, rectangleBounds);

Поделиться:
Популярные книги

Отверженный VIII: Шапка Мономаха

Опсокополос Алексис
8. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VIII: Шапка Мономаха

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Вторая жизнь Арсения Коренева книга третья

Марченко Геннадий Борисович
3. Вторая жизнь Арсения Коренева
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вторая жизнь Арсения Коренева книга третья

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Младший сын князя. Том 8

Ткачев Андрей Сергеевич
8. Аналитик
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Младший сын князя. Том 8

Новый Рал 7

Северный Лис
7. Рал!
Фантастика:
попаданцы
5.00
рейтинг книги
Новый Рал 7

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

На распутье

Кронос Александр
2. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На распутье

Кто ты, моя королева

Островская Ольга
Любовные романы:
любовно-фантастические романы
7.67
рейтинг книги
Кто ты, моя королева

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Измена. Право на любовь

Арская Арина
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на любовь