содержание
Рисование с использованием техники двойной буферизации
рисовать базовую графику
рисовать прямые линии
Метод DrawLine класса Graphics используется для рисования прямой линии. Существует два наиболее распространенных способа перегрузки этого метода:
- public void DrawLine(Pen pen,Point pt1,Point pt2)
Описание параметра:
Pen: объект Pen, определяющий цвет, ширину и стиль линии.
pt1: Структура точек, которая представляет собой первую точку для соединения.
pt2: Точечная структура, представляющая вторую соединяемую точку.
Код:
private void button1_Click(object sender, EventArgs e)
{
Pen blackPen = new Pen(Color.Black, 3);//Создаем экземпляр класса Pen
Point point1 = new Point(10, 50);//Создаем экземпляр класса Point
Point point2 = new Point(100, 50);//Снова создаем экземпляр класса Point
Graphics g = this.CreateGraphics();//Создаем экземпляр класса Graphics
g.DrawLine(blackPen, point1, point2);//Вызов метода DrawLine для рисования прямой линии
}
- public void DrawLine(Pen pen,int x1,int y1,int x2,int y2)
перо: System.Drawing.Pen, которое определяет цвет, ширину и стиль линии.
x1: Координата x первой точки.
y1: координата y первой точки.
x2: Координата x второй точки.
y2: координата y второй точки.
Код:
private void button1_Click(object sender, EventArgs e)
{
Graphics graphics = this.CreateGraphics();//Создание экземпляра класса Graphics
Pen myPen = new Pen(Color.Black, 3);//Создаем экземпляр класса Pen
Graphics.DrawLine(myPen, 150, 30, 150, 100);//Вызов метода DrawLine для рисования прямой линии
}
нарисовать прямоугольник
Метод DrawRectangle класса Graphics используется для рисования прямоугольников. Существует два распространенных метода перегрузки:
- public void DrawRectangle (Pen pen, Rectangle rect);
параметр
Pen: объект Pen, определяющий цвет, ширину и стиль прямоугольника.
rect: структура Rectangle, представляющая прямоугольник для рисования.
Код:
public void DrawRectangleRectangle(PaintEventArgs e)
{
//Создаем черную ручку.
Pen blackPen = new Pen(Color.Black, 3);
// Создаем прямоугольник.
Rectangle rect = new Rectangle(0, 0, 200, 200);
// рисуем на экране.
e.Graphics.DrawRectangle(blackPen, rect);
}
- public void DrawRectangle (Pen pen, int x, int y, int width, int height);
параметр
перо: перо, определяющее цвет, ширину и стиль прямоугольника.
x: x-координата верхнего левого угла прямоугольника, который нужно нарисовать.
y: Координата y верхнего левого угла прямоугольника, который нужно нарисовать.
width: Ширина прямоугольника, который будет нарисован.
height: высота рисуемого прямоугольника.
public void DrawRectangleInt(PaintEventArgs e)
{
//Создаем черную ручку.
Pen blackPen = new Pen(Color.Black, 3);
// Создаем положение и размер прямоугольника.
int x = 0;
int y = 0;
int width = 200;
int height = 200;
// Рисуем прямоугольник на экране.
e.Graphics.DrawRectangle(blackPen, x, y, width, height);
}
нарисовать эллипс
Метод DrawEllipse класса Graphics используется для рисования эллипса. Обычно используются следующие перегрузки:
- public void DrawEllipse (System.Drawing.Pen pen, System.Drawing.Rectangle rect);
параметр
перо: перо, определяющее цвет, ширину и стиль кривой.
rect: структура Rectangle, определяющая границы эллипса.
Код:
private void DrawEllipseRectangle(PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create rectangle for ellipse.
Rectangle rect = new Rectangle(0, 0, 200, 100);
// Draw ellipse to screen.
e.Graphics.DrawEllipse(blackPen, rect);
}
- public void DrawEllipse (System.Drawing.Pen pen, int x, int y, int width, int height);
параметр
перо: перо, определяющее цвет, ширину и стиль кривой.
x: Координата X левого верхнего угла, определяющая ограничивающую рамку эллипса.
y: Координата Y верхнего левого угла ограничивающей рамки, определяющей эллипс.
ширина: определяет ширину границы эллипса.
высота: определяет высоту границы эллипса.
Код:
private void DrawEllipseInt(PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create location and size of ellipse.
int x = 0;
int y = 0;
int width = 200;
int height = 100;
// Draw ellipse to screen.
e.Graphics.DrawEllipse(blackPen, x, y, width, height);
}
нарисовать дугу
Метод DrawArc класса Graphics используется для рисования дуг. Два часто используемых метода перегрузки:
1. public void DrawArc (перо, прямоугольник, плавающий угол startAngle, плавающий угол развертки);
параметр
перо: перо, определяющее цвет, ширину и стиль дуги.
rect: структура RectangleF, определяющая границы эллипса.
startAngle: угол (в градусах), измеренный по часовой стрелке от оси x до начальной точки дуги.
SweepAngle: угол (в градусах), измеренный по часовой стрелке от параметра startAngle до конечной точки дуги.
Код:
private void DrawArcRectangle(PaintEventArgs e)
{
// Create pen.
Pen blackPen= new Pen(Color.Black, 3);
// Create rectangle to bound ellipse.
Rectangle rect = new Rectangle(0, 0, 100, 200);
// Create start and sweep angles on ellipse.
float startAngle = 45.0F;
float sweepAngle = 270.0F;
// Draw arc to screen.
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle);
}
- public void DrawArc (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);
параметр
перо: перо, определяющее цвет, ширину и стиль дуги.
x: координата x верхнего левого угла прямоугольника, определяющего эллипс.
y: координата y верхнего левого угла прямоугольника, определяющего эллипс.
ширина: ширина прямоугольника, определяющего эллипс.
высота: высота прямоугольника, определяющего эллипс.
startAngle: угол (в градусах), измеренный по часовой стрелке от оси x до начальной точки дуги.
SweepAngle: угол (в градусах), измеренный по часовой стрелке от параметра startAngle до конечной точки дуги.
Код:
private void DrawArcInt(PaintEventArgs e)
{
// Create pen.
Pen blackPen= new Pen(Color.Black, 3);
// Create coordinates of rectangle to bound ellipse.
int x = 0;
int y = 0;
int width = 100;
int height = 200;
// Create start and sweep angles on ellipse.
int startAngle = 45;
int sweepAngle = 270;
// Draw arc to screen.
e.Graphics.DrawArc(blackPen, x, y, width, height, startAngle, sweepAngle);
}
сектор розыгрыша
Рисование сектора использует метод DrawPie Graphics. Общие методы перегрузки следующие:
- public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle);
параметр
перо: перо, определяющее цвет, ширину и стиль веера.
rect: структура Rectangle, представляющая ограничивающую рамку, определяющую эллипс, которому принадлежит этот сектор.
startAngle: угол (в градусах), измеренный по часовой стрелке от оси x до первого края сектора.
SweepAngle: угол (в градусах), измеренный по часовой стрелке от параметра startAngle до второго края веера.
Код:
public void DrawPieRectangle(PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create rectangle for ellipse.
Rectangle rect = new Rectangle(0, 0, 200, 100);
// Create start and sweep angles.
float startAngle = 0.0F;
float sweepAngle = 45.0F;
// Draw pie to screen.
e.Graphics.DrawPie(blackPen, rect, startAngle, sweepAngle);
}
- public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);
параметр
перо: перо, определяющее цвет, ширину и стиль веера.
x: координата x верхнего левого угла границы, определяющей эллипс, которому принадлежит сектор.
y: Координата y верхнего левого угла границы, которая определяет эллипс, к которому принадлежит сектор.
ширина: ширина границы, которая определяет эллипс, к которому принадлежит сектор.
высота: высота границы, которая определяет эллипс, к которому принадлежит сектор.
startAngle: угол (в градусах), измеренный по часовой стрелке от оси x до первого края сектора.
SweepAngle: угол (в градусах), измеренный по часовой стрелке от параметра startAngle до второго края веера.
Код:
public void DrawPieInt(PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create location and size of ellipse.
int x = 0;
int y = 0;
int width = 200;
int height = 100;
// Create start and sweep angles.
int startAngle = 0;
int sweepAngle = 45;
// Draw pie to screen.
e.Graphics.DrawPie(blackPen, x, y, width, height, startAngle, sweepAngle);
}
нарисовать многоугольник
Метод DrawPolygon класса Graphics используется для рисования многоугольников. Распространенные перегруженные методы:
- public void DrawPolygon (Pen pen, System.Drawing.Point[] points)
параметр
перо: перо, определяющее цвет, ширину и стиль полигона.
точки: массив структур Point, представляющих вершины многоугольника.
Код:
private void button1_Click(object sender, EventArgs e)
{
Graphics ghs = this.CreateGraphics();//Создаем экземпляр класса Graphics
Pen myPen = new Pen(Color.Black, 3);//Создаем экземпляр класса Pen
Point point1 = new Point(80, 20);//Создаем экземпляр класса Point для представления первой точки
Point point2 = new Point(40, 50);//Создаем экземпляр класса Point для представления второй точки
Point point3 = new Point(80, 80);//Создаем экземпляр класса Point для представления третьей точки
Point point4 = new Point(160, 80);//Создаем экземпляр класса Point для представления четвертой точки
Point point5 = new Point(200, 50);//Создаем экземпляр класса Point для представления пятой точки
Point point6 = new Point(160, 20);//Создаем экземпляр класса Point для представления шестой точки
Point[] myPoints ={ point1, point2, point3, point4, point5, point6 };//Создаем массив структур Point
ghs.DrawPolygon(myPen, myPoints);//Вызов метода DrawPolygon объекта Graphics для рисования многоугольника
}
рисовать текст
Текст рисования использует метод DrawString класса Graphics. Распространенные перегруженные методы:
- public void DrawString (string s, System.Drawing.Font font, System.Drawing.Brush brush, System.Drawing.RectangleF layoutRectangle);
параметр
s: Строка для рисования.
font: Шрифт, который определяет текстовый формат строки.
кисть: кисть, которая определяет цвет и текстуру нарисованного текста.
layoutRectangle: структура RectangleF, указывающая расположение нарисованного текста.
Код:
public void DrawStringRectangleF(PaintEventArgs e)
{
// Create string to draw.
String drawString = "Sample Text";
// Create font and brush.
Font drawFont = new Font("Arial", 16);
SolidBrush drawBrush = new SolidBrush(Color.Black);
// Create rectangle for drawing.
float x = 150.0F;
float y = 150.0F;
float width = 200.0F;
float height = 50.0F;
RectangleF drawRect = new RectangleF(x, y, width, height);
// Draw rectangle to screen.
Pen blackPen = new Pen(Color.Black);
e.Graphics.DrawRectangle(blackPen, x, y, width, height);
// Draw string to screen.
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect);
}
- public void DrawString (string s, System.Drawing.Font font, System.Drawing.Brush brush, System.Drawing.PointF point);
параметр
s: Строка для рисования.
font: Шрифт, который определяет текстовый формат строки.
кисть: кисть, которая определяет цвет и текстуру нарисованного текста.
точка: структура PointF, указывающая верхний левый угол нарисованного текста.
Код:
public void DrawStringPointF(PaintEventArgs e)
{
// Create string to draw.
String drawString = "Sample Text";
// Create font and brush.
Font drawFont = new Font("Arial", 16);
SolidBrush drawBrush = new SolidBrush(Color.Black);
// Create point for upper-left corner of drawing.
PointF drawPoint = new PointF(150.0F, 150.0F);
// Draw string to screen.
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint);
}
- public void DrawString(string s, Font font, Brush brush, float x, float y)
параметр:
s: Строка для рисования.
font:System.Drawing.Font, который определяет текстовый формат строки.
кисть: System.Drawing.Brush, определяющая цвет и текстуру нарисованного текста.
x: x-координата верхнего левого угла нарисованного текста.
y: Координата y верхнего левого угла нарисованного текста.
private void button1_Click(object sender, EventArgs e)
{
String str = "Shenmatang;//Определяем нарисованную строку
Font myFont = new Font("Chinese Xingkai", 20);//Создаем экземпляр объекта Font
SolidBrush myBrush = new SolidBrush(Color.DarkOrange);//Создаем экземпляр объекта кисти
Графика myGraphics = this.CreateGraphics();//Создаем графический объект
MyGraphics.DrawString(str, myFont, myBrush,10,20);//Рисуем текст
}
Комплексный случай
рисовать сигнал
private void button1_Click(object sender, EventArgs e)
{
Graphics graphics = this.CreateGraphics();//Создаем экземпляр класса Graphics формы
Pen myPen = new Pen(Color.Black, 1);//Устанавливаем перо
int beginX = 50; // определяем переменные
int beginY = 65;
int height = 35;
int width = 50;
Point pointX1 = new Point(beginX, beginY);
Point pointY1 = new Point(beginX + 210, beginY);
Point pointX2 = new Point(beginX, beginY - 45);
Point pointY2 = new Point(beginX, beginY + 45);
//Вызываем метод DrawLine для рисования двух вертикально пересекающихся прямых линий, которые используются в качестве горизонтальных и вертикальных координат сигнала
graphics.DrawLine(myPen, pointX1, pointY1);
graphics.DrawLine(myPen, pointX2, pointY2);
//Рисуем кривую Безье с шахматным соединением верхней половины площади
graphics.DrawBezier(myPen, beginX, beginY, beginX + 15, beginY - height, beginX + 40, beginY - height, beginX + width,beginY);
//Нарисуйте кривую Безье ступенчатого соединения в нижней части графика. * 2 , началоY);
// Нарисуйте кривую Бесселя верхней половины площади чередующегося соединения
graphics.DrawBezier(myPen, beginX + width * 2, beginY, beginX + width * 2 + 15, beginY - height, beginX + width * 2+ 40, beginY - height, beginX + width * 3, beginY);
/ Нарисуйте нижнюю половину области Перемежающаяся кривая Бесселя Graphics.drawbezier (Mypen, Beginy + Width * 3, Beginy, Beginy + Width * 3 + 15, Beginy + Height, Beginx + Width * 3+ 40, Beginy + Height, Beginx + Width * 4, Бегини; /
}
Рисование с использованием техники двойной буферизации
Двойная буферизация заключается в создании объекта в памяти, соответствующего области рисования экрана, сначала отрисовке графики объекта в памяти, а затем одновременном копировании графики объекта на экран, что может значительно ускорить скорость рисования. Он в основном используется для решения проблемы мерцания формы при изменении ее размера.
Процесс двойной буферизации выглядит следующим образом:
1. Создайте буфер в памяти, соответствующий холсту
2. Рисование в буфере
3. Скопируйте растровое изображение буфера на текущий холст.
4, освободить буфер памяти
Код:
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private void PaintImage(Graphics g)
{
// Рисование
GraphicsPath path = new GraphicsPath(new Point[]{ new Point(100,60),new Point(350,200),new Point(105,225),new Point(190,ClientRectangle.Bottom),
new Point(50,ClientRectangle.Bottom),new Point(50,180)}, new byte[]{
(byte)PathPointType.Start,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Line,
(byte)PathPointType.Line});
PathGradientBrush pgb = new PathGradientBrush(path);
pgb.SurroundColors = new Color[] { Color.Green, Color.Yellow, Color.Red, Color.Blue, Color.Orange, Color.LightBlue };
g.FillPath(pgb, path);
g.DrawString("Добро пожаловать в Shenmatang!!", new Font("宋体", 18, FontStyle.Bold), new SolidBrush(Color.Red), new PointF(110, 20));
g.DrawBeziers(new Pen(new SolidBrush(Color.Green),2),new Point[] {new Point(220,100),new Point(250,180),new Point(300,70),new Point(350,150)});
g.DrawArc(new Pen(new SolidBrush(Color.Blue), 5), new Rectangle(new Point(250, 170), new Size(60, 60)), 0, 360);
g.DrawRectangle(new Pen(new SolidBrush(Color.Orange), 3), new Rectangle(new Point(240, 260), new Size(90, 50)));
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Bitmap localBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
//Создаем экземпляр растрового изображения
Graphics bitmapGraphics = Graphics.FromImage(localBitmap);
bitmapGraphics.Clear(BackColor);
bitmapGraphics.SmoothingMode = SmoothingMode.AntiAlias;
PaintImage(bitmapGraphics);
Graphics g = e.Graphics;//Получить холст формы
g.DrawImage(localBitmap, 0, 0);//Рисуем изображение в памяти на холсте формы
bitmapGraphics.Dispose();
localBitmap.Dispose();
g.Dispose();
}
}
Эффект: