Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_rab_6.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
210 Кб
Скачать
☆

Класс Brush

Класс Brush, задающий кисти, устроен более сложно. Этот что класс является абстрактным классом, так что создавать кисти этого класса нельзя, но можно создавать кисти классов-потомков Brush. Таких классов пять - они задают кисть:

SolidBrush - для сплошной закраски области заданным цветом;

TextureBrush - для закраски области заданной картинкой (image);

HatchBrush - для закраски области предопределенным узором;

LinearGradientBrush - для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается линейным градиентом;

PathGradientBrush - для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается более сложным путем.

Первые два класса кистей находятся в пространстве имен System.Drawing, остальные - в System.Drawing.Drawing2D.

Примеры работы с кистями показан в листинге3.

Листинг 3. Рисование различных фигур

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics gr = e.Graphics;

//создание кисти синего цвета

SolidBrush brush = new SolidBrush(Color.Blue);

//создание пера

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

//рисование залитого прямоугольника

gr.FillRectangle(brush, 90, 30, 150, 90);

//рисование линий созданным пером

gr.DrawLine(pen, 90, 30, 110, 40);

gr.DrawLine(pen, 90,120, 110, 130);

gr.DrawLine(pen, 240, 30, 260, 40);

gr.DrawLine(pen,240, 120, 260, 130);

gr.DrawRectangle(pen, 110, 40, 150, 90);

//создание кисти красного цвета

brush.Color = Color.Red;

//рисование залитого эллипса

gr.FillEllipse(brush, 280, 75, 100, 50);

gr.DrawLine(pen, 380, 55, 380, 100);

gr.DrawLine(pen, 280, 55, 280, 100);

//рисование не залитого эллипса

gr.DrawEllipse(pen, 280, 30, 100, 50);

}

}

}

Пример приложения рисующего фигуры на форме.

Создадим в нашем проекте новую форму RandomShapes, в которой будем рисовать и закрашивать геометрические фигуры трех разных типов - эллипсы, сектора, прямоугольники. Для каждого типа фигуры будем использовать свой тип кисти: эллипсы будем закрашивать градиентной кистью, сектора - сплошной, а прямоугольники - узорной. Цвет фигуры, ее размеры и положение будем выбирать случайным образом. Рисование фигур будет инициироваться в обработчике события Click. При каждом щелчке кнопкой мыши на форме будут рисоваться три новых экземпляра фигур каждого типа. При этом старые фигуры стираться не будут.

На рис.5 показана форма после нескольких щелчков кнопки мыши. Конечно, черно-белый рисунок в книге не может передать цвета, особенно смену оттенков для градиентной кисти. На экране дисплея или цветном рисунке все выглядит красивее.

А теперь приведем программный код, реализующий рисование. Начнем, как обычно, с полей класса:

int cx,cy;

Graphics graph;

Brush brush;

Color color;

Random rnd;

Рис. 5.  Рисование кистями разного типа

Инициализация полей производится в методе MyInit, вызываемом конструктором класса:

void MyInit()

{

cx = ClientSize.Width;

cy = ClientSize.Height;

graph = CreateGraphics();

rnd = new Random();

}

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

void DrawShapes()

{

for(int i=0; i<3; i++)

{

//выбирается цвет - красный, желтый, голубой

int numcolor = rnd.Next(3);

switch (numcolor)

{

case 0:

color = Color.Blue; break;

case 1:

color = Color.Yellow; break;

case 2:

color = Color.Red; break;

}

//градиентной кистью рисуется эллипс,

//местоположение случайно

Point top = new Point(rnd.Next(cx), rnd.Next(cy));

Size sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));

Rectangle rct = new Rectangle(top, sz);

Point bottom = top + sz;

brush = new LinearGradientBrush(top, bottom,

Color.White,color);

graph.FillEllipse(brush,rct);

//сплошной кистью рисуется сектор,

//местоположение случайно

top = new Point(rnd.Next(cx), rnd.Next(cy));

sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));

rct = new Rectangle(top, sz);

brush = new SolidBrush(color);

graph.FillPie(brush,rct,30f,60f);

//узорной кистью рисуется прямоугольник,

//местоположение случайно

top = new Point(rnd.Next(cx), rnd.Next(cy));

sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y));

rct = new Rectangle(top, sz);

HatchStyle hs = (HatchStyle)rnd.Next(52);

brush = new HatchBrush(hs,Color.White, Color.Black);

graph.FillRectangle(brush,rct);

}

}

В рассмотренном примере многое построено на работе со случайными числами. Случайным образом выбирается один из возможных цветов для рисования фигуры, ее размеры и положение. Наиболее интересно рассмотреть создание кистей разного типа. Когда создается градиентная кисть.

brush = new LinearGradientBrush(top, bottom, Color.White,color);

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

Наиболее просто задается сплошная кисть:

brush = new SolidBrush(color);

Для нее достаточно указать только цвет. Для узорной кисти нужно задать предопределенный тип узора, всего их возможно 52. В нашем примере тип узора выбирается случайным образом:

HatchStyle hs = (HatchStyle)rnd.Next(52);

brush = new HatchBrush(hs,Color.White, Color.Black);

Помимо первого аргумента, задающего тип узора, указываются еще два цвета - первый определяет цвет повторяющегося элемента, второй - цвет границы между элементами узора.

Непосредственное рисование кистью осуществляют методы группы Fill:

graph.FillEllipse(brush,rct);

graph.FillPie(brush,rct,30f,60f);

graph.FillRectangle(brush,rct);

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

Вызов метода DrawShapes, как уже говорилось, встроен в обработчик события Click формы RandomShapes:

private void RandomShapes_Click(object sender, System.EventArgs e)

{

DrawShapes();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]