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




{

LineWidth diag = new LineWidth();

if (diag.ShowDialog(this)== DialogResult.OK)

{

pw = diag.PenWidth);

}

}

Запускаем приложение. Теперь можно рисовать не только разными цветами, но и разной толщиной пера (рис.4).

 

Рис. 4. Приложение EasyPaint и его диалоговое окно "Толщина линии"

Класс 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();

}

 

ЗАДАНИЯ

 

1.Выполните разработку приложения «Простой графический редактор». Приложение должно содержать меню и панель инструментов, посредством которых можно выбрать как изображаемую фигуру, так и задать свойства объектов рисования: перьев, кистей, цвета выводимого изображения. Предусмотрите в меню пункты, позволяющие выполнять загрузку изображений из файла и сохранение их в файле. Изображение, нарисованное в окне приложения не должно исчезать после сворачивания, а затем восстановления размеров окна.

2. Напишите программу, выводящую какой – либо простой рисунок, например, летающую тарелку, изображение снеговика, чипа. Используйте в программе соответствующие графические примитивы. Установите необходимые атрибуты рисунка. Выведите текст например, Это летающая тарелка. Задайте цвет букв и цвет фона выводимого текста.

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

4. Напишите программу, которая рисует дом. При нажатии определенных клавиш зажигается (гасится) свет, струится (или нет) дым из трубы.

5. Напишите программу, изображающую на экране змейку, которая бегает по экрану.

6. Напишите программу, выполняющую следующие действия: шарик катится по полу от стенки к стенке пока не нажата клавиша.

7. Нарисовать на экране песочные часы с сыплющимся песком. Когда последняя песчинка упадет, вывести надпись: прошло ххх секунд. Перевернуть песочные часы. Процесс продолжается, пока не нажата клавиша. Предоставить пользователю возможность установить часы в нужное место экрана перед тем, как начнется отсчет времени.

8. Напишите программу, выполняющую следующие действия: космический объект на звездном небе движется влево, вправо, вверх, вниз, по диагоналям.

9. Нарисовать три параллелепипеда, заполненные различным образом. Создать движение любого из них.

10. Нарисовать три шарика и изобразить их движение на ветру.

11. Нарисовать автомобиль, движущийся влево и вправо.

12. Нарисовать дорогу, автомобиль (условно). Управлять движением автомобиля по дороге с учетом изгибов дороги.

13. Нарисовать человечка и изобразить движение (например, машет руками).

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: