Прежде чем рассматривать работу с графическими примитивами, вначале приведём наиболее важные вспомогательные типы данных, которые широко применяются при графических построениях.
Point (точка) — структура, используемая для задания координат точки на плоскости (x,y). Пример использования см. ниже (Пример 1).
Rectangle (прямоугольник) — структура, обычно определяет координаты левого угла (x,y) и размеры прямоугольной области (ширина и высота). Пример использования см. ниже (Пример 2).
Size (размер) — определяет размеры объекта, полями структуры являются ширина и высота объекта. Задать размеры какого-то объекта можно так:
Size t = new Size(40,30);
В оконном приложении можно сразу использовать объекты данных структур. В консольном приложении для использования этих структур требуется подключить необходимую ссылку. Открываем окно диалога Add Reference из пункта меню Project/Add Reference, далее во вкладке GAC находим строку System.Drawing и нажимаем кнопку OK:
Затем в начале текста программы добавляем строку:
using System.Drawing;
Только после этого можно воспользоваться объектами указанных выше типов.
Пример 1. Использование типа Point:
using System;
using System.Drawing;
namespace Test_Point
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Тест Point:");
// Задаём точку p1 с координатами x=50 и y=100
Point p1 = new Point(50,100);
// Задаём точку p2 с координатами x=40 и y=80
Point p2 = new Point(40,80);
// Изменить (увеличить) координату x на 10, а y на 20 единиц
p2.Offset(10,20);
if(p1==p2) // Координаты точек можно сопоставить на равенство (или на неравенство - операция !=)
Console.WriteLine("Координаты точек равны");
else
Console.WriteLine("Координаты точек не совпадают");
p1.X = 200; // Можно непосредстве задать значение координаты X
p1.Y = 300;
Console.WriteLine(p1); // Печать координат точки
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы:
Тест Point:
Координаты точек равны
{X=200,Y=300}
Press any key to continue . . .
Пример 2. Создаём два объекта: прямоугольник и точку, и проверяем, лежит ли точка внутри прямоугольника:
using System;
using System.Drawing;
namespace Test_Rectangle
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Тест Rectangle:");
int x=100, y=100, // Координаты левого верхнего угла
w=50, h=100; // ширина и высота
Rectangle r = new Rectangle(x, y, w, h);
Console.WriteLine("Прямоугольник: "+r);
Point p = new Point(120, 150);
Console.WriteLine("Точка: "+p);
if(r.Contains(p))
Console.WriteLine("Точка лежит внутри прямоугольника");
else
Console.WriteLine("Точка лежит вне прямоугольника");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы:
Тест Rectangle:
Прямоугольник: {X=100,Y=100,Width=50,Height=100}
Точка: {X=120,Y=150}
Точка лежит внутри прямоугольника
Press any key to continue . . .
Для выполнения простейших графических построений необходимо использовать следующие инструменты: полотно, перья, кисти, шрифты.
1.Полотно — это объект, на который выводится изображение. Данный объект должен иметь тип Graphics. Чаще всего изображение на экран выводится по событию Paint, поэтому создаём обработчик событий MainFormPaint() и в нём обеспечиваем доступ к полотну:
void MainFormPaint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
}
2.Перья — это объекты типа Pen, которые предназначены для рисования линий (отрезки прямых линий, прямоугольники, дуги, эллипсы и т.д.). Для пера можно задать цвет и толщину линии, например:
а)Создаём перо для рисования линий красного цвета. Толщина линий — 1 пиксель (это действует по-умолчанию, если толщина не задана явно):
Pen p1 = new Pen(Color.Red);
б)Теперь создадим перо для рисования линий зелёным цветом толщиной 5 пикселей:
Pen p2 = new Pen (Color.Green, 5);
3.Кисти — это объекты, предназначенные для построения закрашенных геометрических фигур, например: прямоугольников, эллипсов.
а)Закрашивать можно сплошным цветом — используем кисть типа SolidBrush, например, сделаем кисть для заливки голубым цветом:
Brush b1 = new SolidBrush(Color.Blue);
б)Есть вариант — закрашивать область кистью HatchBrush, которая представляет собой какой-либо узор, например, например пересекающиеся вертикальные и горизонтальные линии зелёного цвета на красном фоне:
HatchBrush b3 = new HatchBrush(HatchStyle.Cross, Color.Green, Color.Red);
в)Кроме того, доступна кисть типа TextureBrush, с помощью которой можно для заливки использовать любой рисунок, например, закрасим прямоугольник изображениями рисунка из файла rr.bmp:
Bitmap bitmap = new Bitmap("rr.bmp");
Brush b2 = new TextureBrush(bitmap);
4.Шрифты — объекты, используемые для вывода на экран различных символом и текстов. В шрифтах можно задавать высоту, тип и т.д. Пример:
// Определяем гарнитуру штифта:
FontFamily fontFamily = new FontFamily("Times New Roman");
// Конкретные характеристика шрифта:
Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);
// Вывод текста
g.DrawString("Слово", font, b1, 105, 200);
Пример 3. Ниже приводится полная тестовая программа со всеми упомянутыми примерами:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace Test_Ris0
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void MainFormPaint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p1 = new Pen(Color.Red);
Pen p2 = new Pen (Color.Green, 5);
g.DrawLine(p1, 10,10,100,50);
g.DrawLine(p2,20,20,50,70);
Brush b1 = new SolidBrush(Color.Blue);
g.FillEllipse(b1,100,100,50,50);
Bitmap bitmap = new Bitmap("rr.bmp");
Brush b2 = new TextureBrush(bitmap);
g.FillRectangle(b2,20,120,80,80);
HatchBrush b3 = new HatchBrush(HatchStyle.Cross,Color.Green,Color.Red);
g.FillEllipse(b3,150,150,50,50);
Font f1 = new Font(FontFamily.GenericMonospace, 20, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);
g.DrawString("Tekst",f1,b1,15,200);
FontFamily fontFamily = new FontFamily("Times New Roman");
Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);
g.DrawString("Слово",font,b1,105,200);
}
}
}
На рисунке приведён результат работы данной программы:
Все методы можно условно поделить на группы:
линии, закрашенные контуры и тексты.
Методы для построения линий и незакрашенных контуров начинаются со слова Draw, закрашенные контуры — со слова Fill.
Перечислим наиболее употребительные методы построения графических примитивов:
DrawArc() — дуга;
DrawEllipse() — эллипс
DrawLine() — прямая линия
DrawLines() — набор линий;
DrawPie() — сектор
DrawPolygon() — замкнутый многоугольник
DrawRectangle() — прямоугольник
DrawString() — вывод текста
FillEllipse() — закрашенный эллипс
FillPie() — закрашенный сектор
FillPolygon() — закрашенный многоугольник
FillRectangle() — закрашенный прямоугольник
Пример 4. Приведём пример использования приведённых выше методов:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Test_Ris1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void MainFormPaint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.BlueViolet);
// Дуга
g.DrawArc(p, 10, 10, 50, 50, 0, 90);
// Эллипс
g.DrawEllipse(p, 60, 60, 50, 100);
// Прямая линия
g.DrawLine(p, 40, 40, 100, 70);
// Треугольник
Point [] x = new Point[4];
x[0].X = 100; x[0].Y = 20;
x[1].X = 120; x[1].Y = 120;
x[2].X = 250; x[2].Y = 50;
x[3].X = 100; x[3].Y = 20;
g.DrawLines(p, x);
// Сектор
g.DrawPie(p, 150, 50, 70, 70, 90, 90);
// Замкнутый многоугольник (треугольник)
Pen p1 = new Pen(Color.Red);
Point []x1=new Point[3];
x1[0].X = 200; x1[0].Y=20;
x1[1].X = 220; x1[1].Y=120;
x1[2].X = 350; x1[2].Y=50;
g.DrawPolygon(p1, x1);
// Прямоугольник
g.DrawRectangle(p1, 50, 200, 100,40);
// Вывод текста
Font font = new Font(FontFamily.GenericSansSerif, 20, FontStyle.Italic, GraphicsUnit.Pixel);
g.DrawString("Текст", font, Brushes.Brown, 150, 140);
// Закрашенный эллипс (в данном случае - круг)
g.FillEllipse(Brushes.Blue, 30, 250, 100, 100);
// Закрашенный сектор
g.FillPie(Brushes.Aqua, 150, 250, 100, 100, 120, 60);
// Закрашенный многоугольник (треугольник)
Point []x2=new Point[3];
x2[0].X = 200; x2[0].Y=220;
x2[1].X = 220; x2[1].Y=320;
x2[2].X = 350; x2[2].Y=250;
g.FillPolygon(Brushes.BurlyWood, x2);
// Закрашенный прямоугольник
g.FillRectangle(Brushes.DarkOliveGreen, 300, 300, 100, 70);
}
}
}
Результат работы программы показан на рисунке ниже:
В ряде случаев требуется разместить текст определённым образом относительно какого-то объекта. Например, вывести текст внутри прямоугольника или эллипса. Для этого необходимо знать размера текста, т.е. его ширину и высоту, которые можно получить с помощью метода MeasureString().
Пример 5. Вывод слова «Эллипс» внутри эллипса:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Test_Ris2
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void MainFormPaint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
string s = "Эллипс";
Brush b1 = new SolidBrush(Color.Red);
int x=50, y= 50, w=150, h= 50;
// Рисуем эллипс
g.DrawEllipse(new Pen(Color.Red, 2), x, y, w, h);
// Задаём шрифт
FontFamily fontFamily = new FontFamily("Times New Roman");
Font font = new Font(fontFamily, 24, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Point);
// Определяем ширину и высоту строки s, которая будет выводится шрифтом font.
// Единицы измерения определяются параметром шрифта GraphicsUnit.Point (здесь в пикселях)
SizeF size = g.MeasureString(s,font);
// Вычисляем координаты верхнего угла прямоугольной области,
// в которую будет выводится текст
int x1=(int)(w-size.Width)/2 + x;
int y1=(int)(h-size.Height)/2 + y;
// Вывод текста по середине эллипса
g.DrawString(s, font, b1, x1, y1);
}
}
}
Результат работы приведён на следующем рисунке:
|
|
|