Файл: Лекция 7 Рисование Графики в С# Создание графических изображений состоит из двух этапов.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.11.2023
Просмотров: 105
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лекция №7
Рисование Графики в С#
Создание графических изображений состоит из двух этапов:
-
Создание объекта класса Graphics. -
Рисования линий и фигур на объекте Graphics.
Класс Graphics для рисования
Перед тем как рисовать линии и фигуры, необходимо создать объект класса Graphics, который является поверхностью для рисования. Graphics – это класс имитации поверхности рисования.
Существует несколько способов создания объекта Graphics:
-
С помощью события Paint можно рисовать на компонентах, для которых может быть создан обработчик события Paint -
С помощью метода CreateGraphics(), создающий объект Graphics, связанный с выводом графики на любой компонент. Это Наиболее универсальный способ.
Например 1:
Создаем объект gr класса Graphics с помощью метода CreateGraphics() и связываем его с компонентом panel1:
Graphics gr = panel1.CreateGraphics();//связываем область рисования с панелью и далее рисуем на панели:
gr.DrawLine(Pens.Green,10,10,300,10); //рисуем зеленую линию от точки (10, 10) до точки (300, 10).
gr.DrawEllipse(Pens.Red, 100, 150, 20, 20); //рисуем красный круг
Например 2:
Graphics g2 = button2.CreateGraphics();//связываем область рисования с кнопкой и далее рисуем на кнопке
g2.FillEllipse(Brushes.Green,80,90,30,50); рисуем зеленый эллипс
Методы класса Graphics
Имена большинства методов, класса Graphics, начинается с префикса Draw* и Fill*. Первые из них предназначены для рисования линий и не закрашенных фигур (таких, например, как прямоугольные рамки), а вторые — для рисования закрашенных геометрических фигур. Для всех методов первый параметр ( Pen) – это карандаш определяющий цвет и толщину линии. Как настраивать карандаш рассмотрим ниже.
Метод | Действие | |
; | ||
DrawLine (Pen, x1, y1, x2, y2) | Прямая линия. Параметры x1, y1 – координаты начала линии, x2, y2 — координаты конца линии | |
DrawRectangle (Pen, x, y, w, h) | Контур прямоугольника. x, y — координаты левого верхнего угла; w – ширина прямоугольника, h высота прямоугольника | |
DrawEllipse(Pen, x, y, w, h) | Контур эллипса. параметры x, y, w, h — координаты левого верхнего угла и размер прямоугольника, внутри которого вписан эллипс | |
DrawPolygon(Pen, P) | Контур многоугольника. параметр P (массив типа Point) — координаты углов многоугольника |
Для всех следующих методов Параметр Brush определяет цвет и стиль кисти для закраски ; | |
FillRectangle (Brush, x, y, w, h) | Рисует закрашенный прямоугольник. параметры x, y — координаты левого верхнего угла; параметры w и h задают размер прямоугольника |
FillEllipse(Brush, x, y, w, h) | Рисует закрашенный эллипс. параметры x, y, w, h — координаты левого верхнего угла и размер прямоугольника, внутри которого вычерчивается эллипс |
FillPolygon(Brush, P) | Рисует закрашенный многоугольник. параметр P (массив типа Point) — координаты углов многоугольника |
gr.DrawArc(Pens.Black, 35, 100, 25, 25, 70, 220); дуга эллипса
DrawString(st, aFont, aBrush, x, y); | Вывод текста на графическую поверхность Параметр st задает текст, параметр aFont — шрифт, который используется для отображения текста, a aBrush — цвет текста. Параметры x и y определяют координаты левого верхнего угла области отображения текста |
DrawImage(Image, x, y) | Выводит на графическую поверхность иллюстрацию. Параметр Image определяет иллюстрацию; x и y — координату левого верхнего угла области вывода иллюстрации |
Например:
private void button1_Click(object sender, EventArgs e)
{
Graphics gr = panel1.CreateGraphics();//связываем область рисования с панелью и далее рисуем на панели:
gr.DrawLine(Pens.Green,10,10,300,10); //рисуем зеленую линию из точки (10, 10) в точку (300, 10).
gr.DrawEllipse(Pens.Red, 100, 150, 20, 20); //рисуем красный круг
gr.FillEllipse(Brushes.Green,80,90,30,50); рисуем зеленый эллипс
}
Карандаш
Карандаш определяет вид линии — цвет, толщину и стиль. Существует стандартный набор карандашей, а можно создавать свои. Приведем список карандашей из стандартного набора.
Некоторые карандаши из стандартного набора | ||||
Карандаш | Цвет | | Карандаш | Цвет |
Pens.Red | Красный | | Pens.Purple | Пурпурный |
Pens.Orange | Оранжевый | | Pens.Black | Черный |
Pens.Yellow | Желтый | | Pens.LightGray | Серый |
Pens.Green | Зеленый | | Pens.White | Белый |
Pens.LightBlue | Голубой | | Pens.Transparent | Прозрачный |
Pens.Blue | Синий | | | |
Например, метод DrawLine(Pens.Black, 10,20, 100,20); рисует линию, используя черный (Black) карандаш из стандартного набора карандашей (Pens)толщиной в 1 пиксел.
Цвет, толщину и стиль карандаша, можно изменить. Для этого нужно создать собственный нестандартный карандаш – объект класса Pen, и установить значения соответствующих свойств.
// создать красный "толстый" карандаш myPen
Pen myPen = new Pen(Color.Red, 2); //толщина карандаша=2
// теперь сделаем изменим карандаш myPen и сделаем его зеленым и толщиной 4 пиксела
myPen.Color = Color.Green;
myPen.Width = 4;
Как вы уже поняли:
свойство Color задает Цвет линии
свойство Width задает Толщину линии в пикселах
Стиль карандаша (пунктир) также можно изменить. Чтобы это сделать, надо изменить значение свойства DashStyle. По умолчанию значение этого свойства DashStyle.Solid — что означает сплошная линия;
Можно задать значение DashStyle.Dash — тогда будет пунктирная линия с длинными штрихами;
Например:
// пунктирнаялиния
Pen Pen2 = new Pen(Color.Purple, 3);
Pen2.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
Еще варианты:
DashStyle.Dot — пунктирная линия с короткими штрихами;
DashStyle.DashDot — пунктирная линия, чередование длинного и короткого штрихов;
DashStyle.DashDotDot — пунктирная линия, чередование одного длинного и двух коротких штрихов;
private void button1_Click(object sender, EventArgs e)
{
Graphics gr = panel1.CreateGraphics();//связываем область рисования с панелью
Pen Pen2 = new Pen(Color.Purple, 3); // создаемсвойкарандаш
// пурпурного цвета в 3 пиксела, делаем его пунктирным:
Pen2.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
gr.DrawLine( Реn2,10,10,300,10); //рисуемпунктирнуюлиниюиз точки (10, 10) в точку (300, 10).
gr.DrawEllipse(Реn2, 100, 150, 20, 20); //рисуем пунктирный круг
}
Кисть
Кисти используются для закраски внутренних областей геометрических фигур.
Например, операор
gr.FillRectangle(Brushes.Blue, x, y, w, h);рисует синий закрашенный прямоугольник.
В приведенном примере Brushes.Blue — это стандартная кисть синего цвета. Параметры x, y определяют положение прямоугольника; w, h — его размер.
В распоряжении программиста есть три типа кистей: стандартные, штриховые и текстурные.
Стандартная кисть закрашивает область одним цветом (сплошная закраска).
Кисть | Цвет | Кисть | Цвет |
Brushes.Red | Красный | Brushes.Blue | Синий |
Brushes.Orange | Оранжевый | Brushes.Purple | Пурпурный |
Brushes.Yellow | Желтый | Brushes.Black | Черный |
Brushes.Green | Зеленый | Brushes.LightGray | Серый |
Brushes.LightBlue | Голубой | Brushes.White | Белый |
Для создания объекта «кисть» используются классы, производные от Brush, такие как SolidBrush, TextureBrush и LinearGradientBrush, например:
SolidBrush br = new SolidBrush(Color.Aqua);
g.FillRectangle(br, r); // закраска прямоугольника r на «холсте» g
Derived
System.Drawing.SolidBrush
System.Drawing.TextureBrush
System.Drawing.Drawing2D.HatchBrush
System.Drawing.Drawing2D.LinearGradientBrush
System.Drawing.Drawing2D.PathGradientBrush
System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
Необязательная информация
Штриховая кисть (HatchBrush) закрашивает область путем штриховки. Область может быть заштрихована горизонтальными, вертикальными или наклонными линиями разного стиля и толщины. В табл. 4.5 перечислены некоторые из возможных стилей штриховки.
Таблица 4.5. Некоторые стили штриховки областей
Стиль | Штриховка |
HatchStyle.LightHorizontal | Редкая горизонтальная |
HatchStyle.Horizontal | Средняя горизонтальная |
HatchStyle.NarrowHorizontal | Частая горизонтальная |
HatchStyle.LightVertical | Редкая вертикальная |
HatchStyle.Vertical | Средняя вертикальная |
HatchStyle.NarrowVertical | Частая вертикальная |
HatchStyle.LageGrid | Крупная сетка из горизонтальных и вертикальных линий |
HatchStyle.SmallGrid | Мелкая сетка из горизонтальных и вертикальных линий |
HatchStyle.DottedGrid | Сетка из горизонтальных и вертикальных линий, составленных из точек |
HatchStyle.ForwardDiagonal | Диагональная штриховка "вперед" |
HatchStyle.BackwardDiagonal | Диагональная штриховка "назад" |
HatchStyle.Percent05 — HatchStyle.Percent90 | Точки (степень заполнения 5%, 10%, ..., 90%) |
Пример:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// штриховка (
Drawing2D.HatchBrush myBrush;// объявление штриховой кисти
myBrush = new Drawing2D.HatchBrush( HatchStyle.DottedGrid,// стиль штриховки
Color.Black, // цвет штрихов
Color.SkyBlue); // цвет фона
gr.FillRectangle(myBrush, 10, 10, 190, 160);
}
Текстурную кисть разобрать самостоятельно
Пример :
namespace рисование_круга
{
public partial class Form1 : Form
{
Graphics gr;
int y = 0;
public Form1()
{
InitializeComponent();
gr = panel1.CreateGraphics();//связываемобластьрисованияс panel
}
private void button1_Click (object sender, EventArgs e)
{
gr.DrawEllipse(Pens.Purple,2,2,100,100); // окружность
gr.FillEllipse(Brushes.Red, 80, 50, 80, 100); //закрашенныйэллипс
}
p rivate void button2_Click (object sender, EventArgs e)
{ int x=0;
for (int i = 1; i <= 10; i++)// 10 шт. окружностей наискосок и с увеличением радиуса
{ gr.FillEllipse(Brushes.Aqua, 2+3*x, 2+2*x, 20+x/2, 20+x/2);
x = x + 10;
}
}
Другой способ , через событие Paint
СОЗДАНИЕ ОБЪЕКТА Graphics через Событие Paint
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(Pens.Green,10,10,300,10);
e.Graphics.DrawEllipse(Pens.Red, 10, 5, 100, 100);
e.Graphics.FillEllipse(Brushes.Aqua, 30, 40, 200, 100);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(new Pen(Color.Red, 2), 0, 0, 100, 100);
}
можно рисовать на кнопке и на других компонентах, для которых может быть создан обработчик события Paint
private void button1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(new Pen(Color.Red, 2), 0, 0, 200, 300); //накнопке
}
ИСПОЛЬЗОВАНИЕ ГРАФИКИ И АНИМАЦИИ С ТАЙМЕРОМ
Пример 1: Нарисуем Эллипс, передвигающийся по наклонной линии.
Опишем по шагам пример создания анимации:
-
Разместим на форме компонент timer1 –для отсчета интервалов времени. Свойство Interval – зададим =50 -
Объявим глобальную переменную int y = 0; в начале программы
public partial class Form1 : Form
{
int y = 0;
public Form1()
{
InitializeComponent();
}
2) Сделаем двойной щелчок по таймеру, добавленному на форму
3) В процедуре обработчика событий timer1_Tick напишем следующий текст:
private void timer1_Tick(object sender, EventArgs e)
{//связываем область рисования с панелью
Graphics gr = panel1.CreateGraphics();
//заливаем всю панель цветом фона что бы стереть предыдущий эллипс
gr.FillRectangle(Brushes.White, 0, 0, 1000, 1000);
//или лучше:gr.FillRectangle(Brushes.White, 0, 0, panel1.Width, panel1.Height);
// рисуем эллипс со смещением через каждые 50 миллисекунд=Interval
gr.FillEllipse(Brushes.Red, 1+3*y, 20+y, 50, 30);
y = y + 20; - смещаем координаты центра эллипса
}
private void button3_Click(object sender, EventArgs e)