Създаване на графични обекти
Методи на класGraphics
Понякога, за да се покаже определен процес, не е достатъчно да се заредят графични елементи от файл, необходимо е да се създаде функционална графика или геометрична фигура според определени параметри.
Можете да рисувате графики на функции и геометрични обекти както директно върху формуляра, така и в такива контроли като:Изображение, Панел, TabPageи други.
Всички геометрични обекти се чертаят с помощта на методите и свойствата на класа Graphics. В контролата първо трябва да създадете платно, което ще показва картината.
За да създадете платно за чертеж, напишете командата в кода:
Graphics canvas_name =form.control.CreateGraphics();
където control_control е елементът, върху който ще бъде създадено платното за рисуване.
Пример.
Графики g = this.pictureBox1.CreateGraphics();
Забележка. Control_element може да отсъства, платното може да бъде поставено директно върху формуляра.
Избор на инструменти за рисуване
Перо
Методите от класаGraphics, които рисуват контура на фигура, трябва да получат писалка - обект от класаPen, с който всички фигури ще бъдат нарисувани върху платното. В конструктора на класPenможете да зададете цвета на писалката и нейната дебелина (по-често се казва "ширина на писалката"). Цветът се задава от обекта на класа (структура)Color.
За да създадете писалка с определени характеристики, напишете командата в кода:
Име на писалка = нова писалка (Цвят.цвят, дебелина);
Пример:
Pen p = new Pen(Color.Red, 1);
Четка
За да рисувате създадения графичен обект, използвайте инструментите от класаЧетка. Товакласът четка е по-сложен от класаPen. КласътBrushе абстрактен клас, така че не можете да създавате четки от този клас, но можете да създавате четки от класове наследници на Brush. Има пет такива класа:
- SolidBrush - четки за плътно боядисване на зона със зададен цвят;
- TextureBrush - четки за рисуване на област с зададено изображение (изображение);
- HatchBrush - четки за боядисване на зона с предварително зададен шаблон;
- LinearGradientBrush - четки за плътно рисуване с преход от един цвят към друг, където промяната на нюансите се задава от линеен градиент;
- PathGradientBrush - четки за плътно рисуване с преход от един цвят към друг, където промяната на нюансите е зададена по по-сложен начин.
Първите два класа четки са в пространството на имената System.Drawing, останалите са в System.Drawing.Drawing2D.
За да създадете четка с определени характеристики, напишете командата в кода:
Четка brush_name = нов brush_type (параметри на четката);
Пример:
Четка b = нова SolidBrush(Color.Maroon);
Класификация на методите по обекти, начертани с тяхна помощ
Три групи методи са най-важни за рисуване.
Първият е претовареният методDrawString, който ви позволява да показвате текстове в графичен режим.
· Втората група се състои от методитеDraw:DrawEllipse, DrawLine, DrawArcи други, които позволяват на цветна писалка (обект от класаPen) да рисува геометрични форми: линии, различни криви, правоъгълници, многоъгълници, елипси и т.н.
Третата група включва методитеFill:FillEllipse, FillPie, FillRectangleи други, които ви позволяват да начертаете фигура с цветна писалкаи го нарисувайте с четка (обект от клас, получен отЧетка).
Примери за изграждане на графични обекти
Крива на Безие
Да приемем, че Panel1 е създаден във формуляра в проекта. На този панел начертайте куп криви на Безие, идващи от един център. Центърът на лъча съвпада с точката на контакт на курсора на мишката с панела. Когато натиснете левия бутон на мишката, се появява лъчът. При движение на мишката с натиснат ляв бутон, центърът на лъча се мести след мишката и кривите се преначертават. Щом бутонът на мишката бъде отпуснат, чертежът се фиксира. Двойното щракване изчиства платното.
За да създадете куп криви от три криви на Безие, които произхождат от точката, в която курсорът на мишката докосва платното, направете следното:
1. Създайте клас от глобални променливи за обекти: писалка, платно, координати на центъра на лъча и неговите краища, индикатор за щракване на мишката.
публичен клас MyMouse
обществена статична графична графика; //платно
публична статична писалка MyPen; //писалка
публична статична точка pt, pt1, pt2, pt3;
2. Създайте манипулатор на щракване на мишката, в който записвайте характеристиките на писалката, инициализация на променливи за координатите на кривите и платното. За да проследите позицията на бутоните на мишката в бъдеще, задайте индикатора на мишката на 1 - „натиснат“. При преместване на мишката с натиснат клавиш (със стойност на индикатора, равна на 1), кривите се преначертават. При движение на мишката с ненатиснат клавиш (със стойност на индикатора 0) кривите няма да бъдат изчертани.
частен празен панел1_MouseDown(изпращащ обект, MouseEventArgs e)
MyMouse.MyPen = нова писалка(Color.Azure, 1);
MyMouse.pt = newPoint(); //център на лъча
MyMouse.pt2 = newPoint();
MyMouse.pt3 = newPoint();
MyMouse.pt1 = newPoint();
3. Създайте манипулатор за освобождаване на мишката, в който задайте индикатора на мишката на 0 - "не е натиснат".
частен празен панел1_MouseUp(изпращащ обект, MouseEventArgs e)
4. Създайте манипулатор за движение на мишката. Ако индикаторът на мишката е равен на единица, тогава е необходимо да напишете в кода: изчистване на платното, координатите на центъра на лъча и координатите на кривите на Безие. Трите допълнителни точки на кривите на Безие са статични точки, разположени на различни граници на платното. Допълнителни точки могат да бъдат създадени и с помощта на генератор на произволни числа.
частен празен панел1_MouseMove(изпращащ обект, MouseEventArgs e)
//Прочетете координатите на мишката и ги присвоете на централните координати
MyMouse.pt.X = e.X; MyMouse.pt.Y = e.Y;
//Задайте цвета на първата крива
// Задайте допълнителни точки
MyMouse.pt1.X = 0; MyMouse.pt1.Y = 0;
MyMouse.pt2.X = 0; MyMouse.pt2.Y = panel1.Height;
MyMouse.pt3.X = panel1.Width; MyMouse.pt3.Y = panel1.Height;
// Начертайте първата крива
MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,
MyMouse.pt1.X = panel1.Width; MyMouse.pt1.Y = 0;
MyMouse.pt2.X = panel1.Width; MyMouse.pt2.Y = panel1.Height;
MyMouse.pt3.X = 0; MyMouse.pt3.Y = panel1.Height;
MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,
MyMouse.pt1.X = panel1.Width/3; MyMouse.pt1.Y = panel1.Height / 2;
MyMouse.pt2.X = 2*panel1.Width/3; MyMouse.pt2.Y = panel1.Height/2;
MyMouse.pt3.X = MyMouse.pt.X; MyMouse.pt3.Y = MyMouse.pt.Y;
MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,
5. Създайте манипулатор за двойно щракване на мишката, в който напишете командата за изчистване на платното
частен празен панел1_MouseDoubleClick(изпращащ обект, MouseEventArgs e)
Построяване на триъгълник
В този пример нека създадем кода за начертаване на триъгълник. Координатите на триъгълника се генерират на случаен принцип:
За да създадете триъгълник:
1. Координатите на върховете на триъгълника ще бъдат в структурата “Treyg”. За целта ще създадем променливи за работа със структурата и самата структура.
публичен статичен клас tr
публична статична писалка MyPen;
публична структура Treyg
публична структура B
публична структура C
2. Използвайки генератор на произволни числа, ще създадем координатите на върховете на триъгълника. В този пример размерът на панела е фиксиран: 270x240.
private void treyg(изпращащ обект)
label1.Visible = невярно; Random r = new Random();
tr.MyPen = нова писалка (Color.Blue, 1);
tr.Treyg.A.x = r.Next(80)+10; tr.Treyg.A.y = r.Next(70)+10;
tr.Treyg.B.x = r.Next(80) + 80; tr.Treyg.B.y = r.Next(70) + 160;
tr.Treyg.C.x = r.Next(80) + 180; tr.Treyg.C.y = r.Next(70) + 80;
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, 2, 2);
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, 2, 2);
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.C.x, tr.Treyg.C.y, 2, 2);
// свързвайки ги с линии
tr.graph.DrawLine(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, tr.Treyg.B.x,
tr.graph.DrawLine(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, tr.Treyg.C.x,
tr.graph.DrawLine(tr.MyPen,tr.Treyg.C.x, tr.Treyg.C.y, tr.Treyg.A.x,
3. Ще начертаем триъгълник с щракване на мишката върху панела:
private void panel1_Click(object sender, EventArgs e)
Създаване на функционална графика
В този пример ще създадем код за начертаване на функционална графика на интервала.
За да начертаете функция, имате нужда от:
1. Създайте обекти на платно и писалка:
публична графика на статичен клас
публична статична писалка MyPen;
2. Задайте характеристиките на платното и писалката. Може да има няколко писалки: за начертаване на оси и графики.
graphic.MyPen = new Pen(Color.Blue, 1);
Определете позицията на началото на координатите и границите на областта на чертане: X,Y - началото на координатите, Xmax, Ymax - границите на областта.
int X, Y, Xmax, Ymax;
Xmax = panel1.Size.Width; Ymax = panel1.Size.Height;
X = Xmax / 2; Y = Ymax / 2;
3. Изградете осите на декартовата координатна система:
graphic.graph.DrawLine(graphic.MyPen, 0, Y, Xmax, Y);
graphic.graph.DrawLine(graphic.MyPen, X, 0, X, Ymax);
4. Задайте стъпката за изчисляване на точките по оста Ox в декартовата координатна система и началната точка, в това:
double h = 0,1, Xdec = -4, Ydec = Xdec*Xdec/2-4;
Задайте мащаба и преобразувайте координатите на точката в декартовата координатна система в C# координатната система:
int d = 10, Xp = Convert.ToInt16(Xdec*d)+X, Yp =- Convert.ToInt16(Ydec*d)+Y;
5. Създайте променливи за изчисляване на следващата точка и задайте цикъл за чертане: