12.12. Crtanje raznih oblika ( linija, pravougaonik, kvadrat, krug, elipsa, kružni luk, string (baner) )
1. deo - teorija / objašnjenja - Pročitajte kako je to objašnjeno na portalu Petlja.org:
(preporuka: pokušajte da kod kuće za vežbu uradite neke od primera: kućicu i čiča glišu)
Da se podsetimo:
Klasa Graphics je deo .NET biblioteke i omogućava crtanje na formi ili kontrolama u Windows Forms aplikacijama. Crtanje se obavlja pomoću metoda ove klase.
Svaki oblik ima odgovarajuću metodu za crtanje kao što su DrawLine, DrawRectangle, DrawEllipse i drugi.
Šta se koristi:
- Graphics: Klasa koja omogućava crtanje na formi.
- Pen: Predstavlja olovku kojom se crtaju linije. Možemo definisati boju i debljinu linije pa čak i stil linije.
- Brush: za varijante kada se koriste popunjeni oblici i baneri - četka za popunjavanje bojom
-
Metode: Svaki oblik se crta korišćenjem specifične metode:
DrawLineza linijeDrawRectangleza pravougaonike i kvadrate (FillRectangleza popunjene varijante)DrawElipseza elipse i krugove (FillElipseza popunjene varijante)DrawArcza kružni luk.DrawStringza stringove (banere)
Priprema projekta
-
Pokrenite Visual Studio
-
Napravite novi projekat tipa Windows Forms Application.
-
Na formu dodajte dugmiće sa tekstom "Crtaj liniju", "Crtaj pravougaonik", "Crtaj kvadrat", "Crtaj krug", "Crtaj elipsu", "Crtaj kružni luk", "Crtaj string (baner)". Dugmićima dati i adekvatna imena - da bismo ih razlikovali (btnLinija, btnPravougaonik, btnKvadrat, ....)
-
Dvoklikom na dugme generisati kod za događaj
Click... svako dugme je za crtanje podsebnog oblika.
Prvo da se objasni nešto bez čega ne možemo:
Šta je to Tačka (Point):
Pod tačkom podrazumevamo objekat klase Point ili PointF. Prvi se zadaje celobrojnim, a drugi realnim koordinatama. Konstruktoru najčešće prosleđujemo samo dva broja, koordinate tačke koju definišemo, kao na primer:
Point p1 = new Point(10, 20);
PointF p2 = new PointF(10.2, 20.4);
U nastavku su kratki primeri za crtanje svakog od navedenih oblika.
Za varijacije i više detalja, pročitajte lekcije za koje su linkovi dati na početku lekcije
1. Crtanje linije
Linije se crtaju metodom DrawLine. Potrebno je navesti kakvom se olovkom crta, a zatim početne i krajnje koordinate (ili početna i krajnja tačka).
Sintaksa:
Graphics.DrawLine(Pen pen, int x1, int y1, int x2, int y2);
pen: Olovka koja definiše boju, debljinu i stil linije.x1,y1: Početne koordinate linije.x2,y2: Krajnje koordinate linije.
Naš primer:
private void btnLinija_Click(object sender, EventArgs e){ Graphics g = this.CreateGraphics(); Pen pen = new Pen(Color.Black, 2); g.DrawLine(pen, 10, 10, 200, 10); }
Malo složeniji zadatak je -
Zadatak:
Na formu postaviti dugme i panel po kojem se crta:
- Button (name:
btnDrawLine, Text: "Nacrtaj liniju"). - Panel (name:
drawingPanel,dimenzije: 400x300 px).
Dvoklikom na dugme generisati događaj Click. u koji se dodaje sledeći kod:
private void btnDrawLine_Click(object sender, EventArgs e)
{
// Kreiranje Graphics objekta za crtanje na panelu
using (Graphics g = drawingPanel.CreateGraphics())
using (Pen pen = new Pen(Color.Blue, 2)) // Plava olovka sa debljinom od 2 piksela
{
// Crtanje linije od tačke (50, 50) do tačke (350, 250)
g.DrawLine(pen, 50, 50, 350, 250);
}
}
}
Objašnjenje:
-
Graphicsobjekat: Kreira se pomoćuCreateGraphicsmetode, koja omogućava crtanje na kontrolama poputPanel. -
Penobjekat: Olovka definiše izgled linije: boju, debljinu i stil. U ovom primeru koristimo plavu boju i debljinu od 2 piksela. -
Crtanje linije: Koriste se početne koordinate (50, 50) i krajnje koordinate (350, 250).
-
Korišćenje
using: Osigurava pravilno oslobađanje resursa zaGraphicsiPenobjekte.
Proširenje zadatka
- Izbor boje: Povezati dijalog za izbor boje (
ColorDialog) sa olovkom.
private void btnPickColor_Click(object sender, EventArgs e)
{
using (ColorDialog colorDialog = new ColorDialog())
{
if (colorDialog.ShowDialog() == DialogResult.OK)
{
selectedColor = colorDialog.Color;
}
}
}
Dinamičke koordinate:
Dodajte TextBox za unos koordinata (x1, y1, x2, y2) kako bi korisnik mogao da definiše liniju.
Dodatni zadatak:
- Implementirati crtanje više linija koje formiraju oblik (npr. trougao ili zvezdu).
- Dodati dugme za brisanje panela korišćenjem
Invalidatemetode:
private void btnClearPanel_Click(object sender, EventArgs e)
{
drawingPanel.Invalidate(); // Čisti sadržaj panela
}
2. Crtanje pravougaonika
Pravougaonici se crtaju metodom DrawRectangle, gde se prvo navodi olovka kojom se crta, a zatim gornja leva tačka, širina i visina.
Sintaksa:
Graphics.DrawRectangle(Pen pen, int x, int y, int width, int height);
pen: Olovka koja definiše boju, debljinu i stil ivica pravougaonika.x,y: Koordinate gornjeg levog ugla pravougaonika.width,height: Širina i visina pravougaonika.
Naš primer:
private void btnPravougaonik_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Blue, 2);
g.DrawRectangle(pen, 10, 20, 150, 100);
}
Malo složeniji zadatak je -
Zadatak:
Na formu postaviti dugme i panel po kojem se crta:
- Button (name:
btnDrawRectangle, Text: "Nacrtaj pravougaonik"). - Panel (name:
drawingPanel,dimenzije: 400x300 px).
Dodavanje funkcionalnosti
- Kliknite dva puta na dugme
btnDrawRectangleda biste generisali događajClick. - Dodajte sledeći kod:
private void btnDrawRectangle_Click(object sender, EventArgs e)
{
// Kreiranje Graphics objekta za crtanje na panelu
using (Graphics g = drawingPanel.CreateGraphics())
using (Pen pen = new Pen(Color.Green, 3)) // Zeleno olovka, debljina 3 piksela
{
// Crtanje pravougaonika sa gornjim levim uglom (50, 50) i dimenzijama 200x100
g.DrawRectangle(pen, 50, 50, 200, 100);
}
}
}
Objašnjenje koda
-
Graphicsobjekat: Kreiran pomoćuCreateGraphics, omogućava crtanje na kontrolama (ovde naPanel). -
Penobjekat:- Definiše boju, debljinu i stil ivica pravougaonika.
- U primeru koristimo zelenu boju i debljinu od 3 piksela.
-
Crtanje pravougaonika:
- Početne koordinate su (50, 50).
- Širina pravougaonika je 200, a visina 100.
-
Korišćenje
using: Osigurava automatsko oslobađanje resursa zaGraphicsiPenobjekte.
Proširenje funkcionalnosti
- Popunjavanje pravougaonika:
KoristiteFillRectanglemetodu da biste popunili pravougaonik bojom:
using (SolidBrush brush = new SolidBrush(Color.LightBlue))
{
g.FillRectangle(brush, 50, 50, 200, 100);
}
int width = int.Parse(txtWidth.Text);
int height = int.Parse(txtHeight.Text);
g.DrawRectangle(pen, 50, 50, width, height);
Omogućite korisnicima da izaberu boju olovke pomoću
ColorDialog.Testiranje aplikacije
- Pokrenite aplikaciju.
- Kliknite na dugme "Nacrtaj pravougaonik" i posmatrajte prikaz na panelu.
- Eksperimentišite sa bojom, debljinom i dimenzijama pravougaonika.
Moguće izmene
- Dodajte dugme za popunjavanje pravougaonika pomoću
FillRectangle. - Implementirajte unos koordinata (x, y) pomoću TextBox kontrola.
- Dodajte opciju za crtanje pravougaonika sa zaobljenim uglovima korišćenjem metoda kao što je
DrawArc.
3. Crtanje kvadrata
Kvadrat je specijalan pravougaonik gde su širina i visina jednake. To znači sledeće: kvadrat se crta metodom DrawRectangle, ali sa jednakom širinom i visinom.
private void btnKvadrat_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Green, 2);
g.DrawRectangle(pen, 10, 130, 100, 100);
}
Malo složeniji zadatak je -
Zadatak:
Na formu postaviti dugme i panel po kojem se crta:
- Button (name:
btnDrawSquare, Text: "Nacrtaj kvadrat"). - Panel (name:
drawingPanel,dimenzije: 400x300 px).
Dodavanje funkcionalnosti
- Kliknite dva puta na dugme
btnDrawSquareda biste generisali događajClick. - Dodajte sledeći kod:
private void btnDrawSquare_Click(object sender, EventArgs e)
{
// Kreiranje Graphics objekta za crtanje na panelu
using (Graphics g = drawingPanel.CreateGraphics())
using (Pen pen = new Pen(Color.Red, 3)) // Crvena olovka, debljina 3 piksela
{
// Definisanje koordinata i dimenzije kvadrata
int x = 50, y = 50, strana = 100;
// Crtanje kvadrata
g.DrawRectangle(pen, x, y, strana, strana);
}
}
}
Objašnjenje koda
-
Graphicsobjekat: Kreiran pomoćuCreateGraphics, omogućava crtanje na kontrolama (ovde naPanel). -
Penobjekat:- Definiše boju, debljinu i stil ivica kvadrata.
- U primeru koristimo crvenu boju i debljinu od 3 piksela.
-
Definisanje koordinata i dimenzija:
- Korisimo promenljive
x,yza početne koordinate isideza dužinu stranice kvadrata.
- Korisimo promenljive
-
Korišćenje
using: Osigurava automatsko oslobađanje resursa zaGraphicsiPenobjekte.
Proširenje funkcionalnosti
- Popunjavanje kvadrata bojom:
Koristite metoduFillRectangleza popunjavanje kvadrata bojom:
using (SolidBrush brush = new SolidBrush(Color.Yellow))
{
g.FillRectangle(brush, x, y, strana, strana);
}
int strana = int.Parse(txtSideLength.Text);
g.DrawRectangle(pen, x, y, strana, strana);
Omogućite korisnicima da izaberu boju olovke pomoću
ColorDialog.Testiranje aplikacije
- Pokrenite aplikaciju.
- Kliknite na dugme "Nacrtaj kvadrat" i posmatrajte prikaz na panelu.
- Izmenite dimenzije i boje u kodu ili pomoću dodatnih kontrola da biste testirali različite opcije.
Moguće izmene
- Dodajte dugme za popunjavanje kvadrata bojom pomoću
FillRectangle. - Implementirajte unos koordinata (x, y) pomoću TextBox kontrola.
- Dodajte dugme za crtanje više kvadrata na različitim koordinatama.
- Napravite funkciju koja crta mrežu kvadrata (npr. šahovsku tablu) koristeći petlje.
// Primer mreže kvadrata:
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
g.DrawRectangle(pen, x + i * strana, y + j * strana, strana, strana);
}
}
4. Crtanje elipse
Elipsa je oblik definisan pravougaonikom u koji se može ucrtati. Širina i visina pravougaonika određuju proporcije elipse. Za crtanje elipse koristimo metodu DrawEllipse.
Sintaksa:
Graphics.DrawEllipse(Pen pen, int x, int y, int width, int height);
pen: Olovka za crtanje ivica elipse.x,y: Koordinate gornjeg levog ugla pravougaonika.width,height: Širina i visina pravougaonika koji ograničava elipsu.
Naš primer:
private void btnElipsa_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Purple, 2);
g.DrawEllipse(pen, 120, 130, 150, 100);
}
Malo složeniji zadatak je -
Zadatak:
Na formu postaviti dugme i panel po kojem se crta:
- Button (name:
btnDrawEllipse, postaviti Text svojstvo na "Nacrtaj elipsu"). - Panel (name:
drawingPanel,dimenzije postaviti na 400x300 px).
Dodavanje funkcionalnosti
- Kliknite dva puta na dugme
btnDrawEllipseda biste generisali događajClick. - Dodajte sledeći kod:
private void btnDrawSquare_Click(object sender, EventArgs e)
{
// Kreiranje Graphics objekta za crtanje na panelu
using (Graphics g = drawingPanel.CreateGraphics())
using (Pen pen = new Pen(Color.Green, 3)) // Zelena olovka, debljina 3 piksela
{
// Definisanje koordinata i dimenzija elipse
int x = 50, y = 50, sirina = 150, visina=100;
// Crtanje elipse
g.DrawEllipse(pen, x, y, sirina, visina);
}
}
}
Objašnjenje koda
- Definisanje koordinata i dimenzija:
xiypredstavljaju početne koordinate gornjeg levog ugla pravougaonika, dok susirinaivisinadimenzije tog pravougaonika. DrawEllipse: Crta elipsu unutar definisanog pravougaonika.Pen: Koristi se za crtanje ivica elipse, definišući boju i debljinu.using: Osigurava automatsko oslobađanje resursa korišćenih za crtanje.
Proširenje funkcionalnosti
- Popunjavanje elipse:
Koristite metoduFillEllipseza popunjavanje elipse bojom:
using (SolidBrush brush = new SolidBrush(Color.LightBlue))
{
g.FillEllipse(brush, x, y, sirina, visina);
}
int sirina = int.Parse(txtSirina.Text);
int visina = int.Parse(txtVisina.Text);
g.DrawEllipse(pen, x, y, sirina, visina);
Dodajte petlju za crtanje niza elipsa:
for (int i = 0; i < 5; i++)
{
g.DrawEllipse(pen, x + i * 20, y + i * 20, width, height);
}
Testiranje aplikacije
- Pokrenite aplikaciju.
- Kliknite na dugme "Nacrtaj elipsu" i posmatrajte prikaz na panelu.
- Eksperimentišite sa različitim dimenzijama, bojama i koordinatama.
5. Crtanje kruga
Krug se crta metodom DrawEllipse. Krug je poseban slučaj elipse gde su širina i visina iste, pa se elipsa ponaša kao krug.
private void btnKrug_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Red, 2);
g.DrawEllipse(pen, 120, 20, 100, 100);
}
6. Crtanje kružnog luka
Kružni luk je deo elipse, a crta se metodom DrawArc. Potrebno je navesti početni i krajnji ugao u stepenu.
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Orange, 2);
g.DrawArc(pen, 10, 250, 150, 100, 0, 180);
}
Za proučavanje kod kuće: Malo detaljnije objašnjenje je ->
Metoda DrawArc
Sintaksa:
public void DrawArc(Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle);
pen: Olovka (Pen) koja definiše boju, širinu i stil linije.xiy: Koordinate gornjeg levog ugla pravougaonika u kojem je elipsa upisana.widthiheight: Širina i visina pravougaonika (odnosno elipse).startAngle: Početni ugao luka u stepenima (računa se od horizontalne ose u smeru kazaljke na satu).sweepAngle: Dužina luka u stepenima (pozitivan broj za smer kazaljke na satu, negativan za suprotno).
Primer koda
U sledećem primeru crta se kružni luk unutar pravougaonika dimenzija 200x200, počevši od ugla 0° do 120°:
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Pristup Graphics objektu
Graphics g = e.Graphics;
// Definicija olovke za crtanje
Pen pen = new Pen(Color.Blue, 2);
// Dimenzije pravougaonika
float x = 50; // X koordinata
float y = 50; // Y koordinata
float width = 200; // Širina pravougaonika
float height = 200; // Visina pravougaonika
// Uglovi za luk
float startAngle = 0; // Početni ugao
float sweepAngle = 120; // Dužina luka
// Crtanje kružnog luka
g.DrawArc(pen, x, y, width, height, startAngle, sweepAngle);
// Oslobađanje resursa olovke
pen.Dispose();
}
Objašnjenja
-
Definicija pravougaonika i ugla:
- Pravougaonik dimenzija
(x, y, width, height)određuje područje unutar kojeg se elipsa (a samim tim i luk) iscrta.
- Pravougaonik dimenzija
-
Crtanje luka:
startAngleje ugao od 0 stepeni, što odgovara "3 sata" na kružnom satu.sweepAngledefiniše dužinu luka (120° u smeru kazaljke na satu).
Rezultat
Nakon pokretanja aplikacije, pojaviće se prozor sa kružnim lukom u plavoj boji, debljine linije 2 piksela. Luk će biti deo elipse dimenzija 200x200 i protezaće se od 0° do 120° u smeru kazaljke na satu.
Varijacija: Ako kao krajnji ugao postavite 180° - dobićete smešak7. Crtanje stringa (banera)
Za crtanje teksta koristi se metoda DrawString. Potrebno je definisati tekst, font, boju i poziciju.
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Font font = new Font("Arial", 16);
Brush brush = new SolidBrush(Color.Black);
g.DrawString("Dobrodošli!", font, brush, 50, 300);
}
Za proučavanje kod kuće: Malo detaljnije objašnjenje je ->
Za crtanje stringa (tekstualnog banera) koristi se metoda DrawString. Ova metoda omogućava prikaz teksta na definisanoj lokaciji unutar grafičkog konteksta (obično unutar kontrola poput Form ili PictureBox).
1. Početak
Otvoriti projekat tipa Windows Forms Application ...
2. Dodavanje Paint događaja
Da biste koristili Graphics, potrebno je obrađivati događaj Paint koji se automatski poziva kada se forma crta (ili osvežava).
- Na vašoj formi ( Form1 ) u Properties prozoru izaberite Paint iz liste događaja forme. Dvoklikom kreirajte događaj.
3. Korišćenje DrawString metode
U metodi Form1_Paint, treba da se piše kod za crtanje stringa.
// Paint događaj forme
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Kreiranje Graphics objekta
Graphics g = e.Graphics;
// Tekst za crtanje
string text = "Dobrodošli na naš baner!";
// Font za tekst
Font font = new Font("Arial", 24, FontStyle.Bold);
// Boja teksta
Brush brush = Brushes.Blue;
// Lokacija teksta
PointF location = new PointF(50, 100);
// Crtanje stringa
g.DrawString(text, font, brush, location);
// Oslobađanje resursa
font.Dispose();
}
4. Objašnjenja
Graphics g = e.Graphics;
e.Graphicspredstavlja grafički kontekst prozora koji se crta.
- Tekstualni sadržaj
string text = "Dobrodošli na naš baner!";
Ovo je tekst koji će se prikazati na ekranu.
- Font i stilovi
Font font = new Font("Arial", 24, FontStyle.Bold);
Definiše se font, veličina (24 piksela), i stil (Bold- podebljano).
- Četkica za boju
Brush brush = Brushes.Blue;
Koristi se četkica za crtanje teksta u plavoj boji.
- Lokacija teksta
PointF location = new PointF(50, 100);
Ovo je početna tačka teksta (50 piksela od leve ivice i 100 od vrha forme).
- Crtanje teksta
g.DrawString(text, font, brush, location);
Ova metoda koristi definisani tekst, font, boju i lokaciju za prikaz.
5. Dodavanje efekata
Za dinamičke banere, možete koristiti timer za animaciju teksta. Na primer, da tekst "klizi" s leva na desno...
Predlog za Vežbe
-
Crtanje mreže linija
-
Nacrtajte više linija koje formiraju mrežu.
-
-
Pravougaonici u različitim bojama
-
Dodajte pravougaonike sa različitim bojama.
-
-
Kombinacija kvadrata i krugova
-
Nacrtajte kvadrat sa krugom unutar njega.
-
-
Tekstualni baneri
-
Prikažite tekst na različitim pozicijama sa različitim fontovima i veličinama.
-
-
Kombinovanje oblika
-
Napravite sliku koja sadrži sve oblike naučene u ovoj lekciji.
-
...