Sunteți pe pagina 1din 10

Programare orientată pe obiecte Curs 11

Afişarea grafică

Subsistemul care tratează afişarea grafică se numeşte GDI+. GDI (Graphical Device
Interface) a fost modelul grafic din Windows începând cu Windows 3.0. De-a lungul timpului
acesta a fost mult îmbunătăţit pentru cadrul de lucru .NET, astfel explicându-se adăugarea
semnului (+). GDI+ oferă o bibliotecă de clase pentru efectuarea de operaţii grafice.
Funcţionalitatea interfeţei GDI+ se întinde peste mai multe spaţii de nume.
o System.Drawing – asigură funcţionalitatea de bază;
o System.Drawing.Drawing2D – pune la dispoziţie funcţii grafice bidimensionale şi
vectoriale mai avansate;
o System.Drawing.Imaging – asigură funcţionalitatea pentru prelucrarea de imagini;
o System.Drawing.Text – oferă funcţii tipografice suplimentare faţă de System.Drawing
o System.Drawing.Printing – tratează operaţiile de tipărire.

Spaţiile de nume System.Drawing


Principalele clase din System.Drawing sunt:

Clasa Descrierea
Bitmap Reprezintă un obiect bitmap. Această clasă poate lucra cu câteva
formate standard, printre care : BMP, GIF, şi JPG.
Brush Clasă care reprezintă “pensule” pentru umplerea interioarelor
diverselor forme.
Brushes O colecţie de pensoane.
Color Structură care reprezintă o culoare..
Font Reprezintă un font.
FontFamily Reprezintă o familie de fonturi.
Graphics Reprezintă o suprafaţă de desen.
Icon Reprezintă un obiect icon.
Image Clasă abstractă care stă la baza altor clase, printre care Bitmap şi
Metafile.
Pen Clasă ale cărei obiecte reprezintă “creioanele” folosite pentru
desenarea formelor şi contururilor.
Pens O colecţie de pensoane.
Point, PointF Clase folosite pentru reprezentarea punctelor ce au coordonatele
X,Y întregi sau în virgulă mobilă.
Rectangle, RectangleF Clase folosite pentru reprezentarea dreptunghiurilor (valori întregi
sau în virgulă mobilă).
Region Reprezintă o regiune (nu neapărat dreptunghiulară)

1 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

Clasa Descrierea
Size, SizeF Structurile de tip întreg sau în virgulă mobilă care reprezintă o
dimensiune.
SolidBrush O pensulă care utilizează o culoare pentru a umple formele.
StringFormat Încapsulează un set de informaţii de machetare a textelor, cum ar
fi: alinierea şi spaţierea liniilor.
TextureBrush O pensulă care utilizează o imagine pentru a umple formele.

Structurile Point şi PointF

Reprezintă o pereche ordonată de întregi/numere în virgulă mobilă, ce definesc un


punct în plan.
Accesul la aceste coordonate se face prin intermediul proprietăţilor X şi Y.
Exemplu:
Point P1=new Point(25,100);
PointF P2=new PointF(23.7F,7.23F);

Structurile Size şi SizeF

Reprezintă o pereche de întregi/numere în virgulă mobilă, ce definesc de obicei lăţimea


şi înălţimea unui dreptunghi. Accesul la aceste coordonate se face prin intermediul
proprietăţilor Width şi Height.
Exemplu:
Size S1=new Size(25,100),S2=new Size(P1);
SizeF S3=new SizeF(23.7F,7.23F),S4=new SizeF(P2);

Structurile Rectangle şi RectangleF

Reţin un set de patru întregi/numere în virgulă mobilă care reprezintă locaţia şi


dimensiunea unui dreptunghi. Accesul la aceste valori se face prin intermediul proprietăţilor
X,Y, Width, Height.
Exemplu:
Rectangle R1=new Rectangle(0,25,100,100), R2=new Rectangle(P1,S1);
RectangleF R3=new RectangleF(24.5F,23.7F,7.23F,5.2F),R4=new RectangleF(P2,S3);

Utilizarea culorilor

Culorile sunt reprezentate de structura System.Drawing.Color şi sunt formate din


patru componente: Red, Green, Blue şi Alpha. Primele trei reprezintă cantităţile de roşu, verde
şi albastru (valori cuprinse între 0 şi 255). Cantitatea Alpha reprezintă transparenţa culorii şi
poate varia între 0 (complet transparent) şi 255 (complet opac).
Structura Color defineşte un număr mare de proprietăţi care reprezintă culorile definite de
sistem, începând cu AliceBlue şi terminând cu YellowGreen.
Nu există constructor definit dar se pot utiliza metodele statice FromArgb, FromKnownColor,
FromName pentru a crea obiecte Color.
o FromArgb – crează o culoare dintr-un set de valori Alpha, Red, Green, Blue;

2 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

o FromKnownColor – crează un obiect Color dintr-un membru al enumerării


KnownColor;
o FromName – crează un obiect pornind de la un nume.

Exemple :
Color rosu = Color.FromArgb(255, 0, 0);//o culoare opaca
Color c = Color.FromArgb(110, 33, 66, 99);//o culoare semi-transparentă
Color rosu_semitransparent = Color.FromArgb(127, rosu.R, rosu.G, rosu.B); //o
culoare semitransparentă
Observaţie: Proprietăţile A,R,G şi B pot fi utilizate pentru a accesa componentele obiectului
Color.

Utilizarea fonturilor

Pentru a utiliza fonturile într-un program vom folosi clasa System.Drawing.Font. Un


font se poate defini specificând familia (ex. Time New Roman), dimensiunea și stilul. Printre
constructorii clasei avem:

public Font(Font, FontStyle);


- construiește un nou font utilizând un font existent și o enumerare FontStyle.
public Font(String, Single);
- construiește un nou font pornind de la o familie de fonturi și de la o dimensiune speificată.
public Font(String, Single, FontStyle);
- construiește un nou font pornind de la o familie de fonturi, de la o dimensiune speificată și de
la o enumerare FontStyle.

Proprietăţi specifice

Nume Descriere
Bold Dă o valoare care indică dacă fontul are aplicat stilul bold.

FontFamily Dă valoarea FontFamily asociată fontului.

Italic Dă o valoare care indică dacă fontul are aplicat stilul italic.

Name Dă numele fontului.

Strikeout Dă o valoare care indică dacă textul care va fi scris utilizând acest font este tăiat
cu o linie orizontală.

Style Dă informații despre stilul fontului.

Underline Dă o valoare care indică dacă fontul are aplicat stilul underline.

3 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

Observație: Pentru a determina dimensiunile unui anumit text într-un context grafic se poate
folosi metoda MeasureString din clasa Graphics, ca in exemplul de mai jos:

Graphics g;
SizeF ms;
Font f;
...

f = new System.Drawing.Font("Arial", 12);


ms=g.MeasureString("text",f);
float a=ms.Width;//latimea textului
float b=ms.Height;//inaltimea textului

Clasa Pen
Obiectele clasei Pen sunt utilizate pentru a reprezenta “creioanele” utilizate pentru
desenarea formelor şi contururilor. Obiectele Pen simple sunt create prin specificarea unei
lăţimi de linie (în pixeli) şi a unei culori.

Exemple:
Pen pen1=new Pen(Color.Black);//crează un creion negru cu laţimea prestabilită
de un pixel
Pen pen2=new Pen(Color.Red,2.0F);//crează un creion roşu cu laţimea de doi
pixeli
Se pot crea şi obiecte Pen mai avansate, specificând un argument Brush în loc de
Color. Astfel se pot umple liniile cu imagini sau modele.

Observaţie: Clasa Pens are proprietăţi care definesc peste 140 de creioane ce reprezintă gama
completă de culori definite de sistem. Fiecare dintre acestea are lăţimea de un pixel.

Obiecte Brush
Obiectele Brush sunt de mai multe feluri, toate provenind din clasa de bază Brush. Cel
mai simplu obiect este SolidBrush, care umple o suprafaţă cu o culoare omogenă.

Exemplu:
SolidBrush br1=new SolidBrush(Color.Blue);//crează o pensulă albastră

Clasa TextureBrush utilizează o imagine pentru umplerea formelor. Dacă imaginea


este mai mică decât forma, poate fi multiplicată pe toată suprafaţa formei:

Exemplu:
TextureBrush br2=new TextureBrush(new Bitmap("brush.bmp"),
System.Drawing.Drawing2D.WrapMode.Tile); //crează un obiect TextureBrush care va fi
multiplicat pe toată suprafaţa formei

Observaţie: Clasa Brushes are proprietăţi care definesc pensule definite de sistem.

4 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

Clasa Image

Aceasta este o clasă abstractă care stă la baza claselor Bitmap şi Metafile.

Proprietăţi

Height Dă înălţimea obiectului Image.

HorizontalResolution Dă rezoluţia orizontală (pixeli-pe-inch) a


obiectului Image.
Palette Dă sau setează paleta de culori utilizată de
obiectul Image.
RawFormat Dă formatul obiectului Image: Bmp, Gif, Icon,
Jpeg, Wmf etc.
Size Dă sau setează lăţimea şi înălţimea, în pixeli, a
imaginii.
VerticalResolution Dă rezoluţia verticală (pixeli-pe-inch) a
obiectului Image.
Width Dă lăţimea obiectului Image.

Metode

Clone Crează o copie a obiectului Image.


FromFile Crează o imagine dintr-un fişier specificat.
FromStream Overloaded. Crează o imagine dintr-un stream.
GetFrameCount Dă numărul de frame-uri ale obiectului.
GetPixelFormatSize Dă adâncimea culorii (numărul de biţi pe
pixel) pentru formatul specificat.
RotateFlip Folosită pentru rotiri şi simetrii ale imaginii.
Save Salvează imaginea în formatul specificat.
SelectActiveFrame Selectează frame-ul specificat prin dimensiune
şi index.

Exemplu de utilizare a metodei Save:


img.Save("c:\\poza.bmp");
img.Save("c:\\poza.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

5 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

Clasa Bitmap
Un obiect Bitmap reprezintă o imagine grafică (reprezentată prin pixeli) împreună cu
atributele sale.

Pentru crearea obiectelor Bitmap putem folosi constructorii:

public Bitmap(Image); // crează un obiect Bitmap dintr-un obiect Image existent.


public Bitmap(Stream); // crează un obiect Bitmap dintr-un flux dat.
public Bitmap(String); // crează un obiect Bitmap avand la bază fişierul aflat la adresa
specificată.
public Bitmap(Image, Size);
sau
public Bitmap(Image, int, int);// crează un obiect Bitmap (de dimensiuni specificate) dintr-un
obiect Image existent.
public Bitmap(int, int); // crează un obiect Bitmap de dimensiuni specificate

Metode specifice

GetPixel Dă culoarea pixelului specificat.


MakeTransparent Culoarea specificata devine transparenta.
SetPixel Setează culoarea pixelului specificat.
SetResolution Setează rezoluţia obiectului Bitmap.

Exemplu în care încărcăm imaginea aflată la adresa "resurse\\poza.jpg" apoi


afişăm alăturat imaginea iniţială şi imaginea modificată (pixelii care au iniţial culoarea egală
cu cea a pixelului aflat în poziţia (2,2) devin transparenţi).

Graphics g=p.CreateGraphics();
Bitmap bm=new Bitmap("resurse\\poza.jpg");
bm=new Bitmap(bm,200,200); //redimensionam
g.DrawImage(bm,0,0,300,250);
Color c=bm.GetPixel(2,2);
bm.MakeTransparent(c);
g.DrawImage(bm,300,0,300,250);

Clasa Graphics
Clasa Graphics suportă operaţii de desenare, iar un obiect al clasei Graphics reprezintă
locaţia către care se trimite afişarea grafică, dar poate oferi şi informaţii despre dispozitivul
utilizat. Un obiect al acestei clase reprezintă o structură de date fundamentală din Windows,
denumită context de dispozitiv, fiind de fapt un intermediar între utilizator şi dispozitivul de
ieşire.
Obiectele clasei Graphics nu sunt create direct ci se obţin cu ajutorul metodei
CreateGraphics.

6 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

Exemplu:
Graphics g=formularulMeu.CreateGraphics();

Un obiect Graphics utilizează resurse de sistem care vor fi eliberate din memorie
atunci când obiectul este colectat la gunoi. Cum nu se cunoaşte momentul în care se
colectează gunoiul, este recomandat ca după utilizare, resursele să fie eliberate, apelând
metoda Dispose:
Exemplu:
g.Dispose();

Clasa Graphics include multe metode, cele mai des utilizate fiind prezentate în tabelul
de mai jos.

Metode

Clear Umple întreaga suprafaţă de desenare cu o culoare.


Dispose Eliberează resursele utilizate de obiectul Graphics.
DrawArc Desenează un arc de elipsă
DrawBezier Desenează o curbă Bézier definită prin patru puncte.
DrawBeziers Desenează o curbă Bézier definită printr-un tablou de puncte.
DrawClosedCurve Desenează o curbă închisă definită de un tablou de puncte.
DrawCurve Desenează o curbă având la bază un tablou de puncte.
DrawEllipse Desenează o elipsă definită de un dreptunghi delimitator.
DrawIcon Desenează o pictogramă.
DrawImage Desenează imaginea specificată în locaţia precizată.
DrawLine Desenează o linie între două puncte precizate.
DrawLines Desenează o serie de segmente ce unesc punctele precizate într-
un tablou de puncte.
DrawPath Desenează un obiect GraphicsPath.
DrawPie Desenează un sector de cerc definit de o elipsă şi două linii
radiale.
DrawPolygon Desenează un poligon definit de un tablou de puncte.
DrawRectangle Desenează un dreptunghi.
DrawString Scrie textul specificat în locaţia specificată, folosind câte un
obiect Brush şi Font.
FillClosedCurve Umple interiorul unei curbe închise definită de un tablou de
puncte.
FillEllipse Umple interiorul unei elipse definită de un dreptunghi
delimitator.
FillPath Umple interiorul unui obiect GraphicsPath.
FillPie Umple interiorul unui sector de cerc definit de o elipsă şi două

7 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

linii radiale.
FillPolygon Umple interiorul unui poligon definit de un tablou de puncte.
FillRectangle Umple interiorul unui dreptunghi.
FromImage Crează un obiect Graphics nou dintr-un obiect Image.
MeasureString Dă dimensiunile unui text, precizîndu-se fontul folosit.
RotateTransform Aplică o rotaţie dată de o matrice.
Save Salvează contextul grafic reprezentat de obiectul curent.

Modul de utilizare a principalelor metode este prezentat în programul următor.

void deseneaza(Graphics g){


Bitmap bm=new Bitmap("resurse\\Azul.jpg");
System.Drawing.Font f=new System.Drawing.Font("Times New Roman",12);
bm=new Bitmap(bm,150,100);
g.Clear(Color.White);
g.DrawArc(new Pen(Color.Blue,3),new Rectangle(10,10,100,50),0,90);//pot
fi si valori de tip float
g.DrawArc(Pens.Red,10,10,100,50,90,90);//pot fi si valori de tip float
g.DrawString("DrawArc",f,Brushes.Blue,120,35);//scrie in punctul dat

Rectangle r=new Rectangle(10,70,100,50);


g.DrawEllipse(new Pen(Color.Green,4),r);//sau
g.DrawEllipse(Pens.Red,10,70,100,50);pot fi si valori de tip float

8 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

g.FillEllipse(new SolidBrush(Color.Yellow),r);//sau g.FillEllipse(new


SolidBrush(Color.Yellow),10,70,100,50);pot fi si valori de tip float
g.DrawString("DrawEllipse FillEllipse",f,Brushes.Blue,new
RectangleF(120,70,100,50));//scrie in zona data

r.Y+=70;
g.FillEllipse(new TextureBrush(bm),r);
StringFormat sf=new StringFormat();
sf.Alignment=StringAlignment.Center;
g.DrawString("FillEllipse cu TextureBrush",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50),sf);//am folosit si formatari pentru text

r.Y+=70;
g.DrawRectangle(new Pen(Color.Blue,4),r);
g.FillRectangle(new SolidBrush(Color.Red),r);
g.DrawString("DrawRectangle FillRectangle",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,120,50));

r.Y+=70;
g.FillRectangle(new TextureBrush(bm),r);
g.DrawString("FillRectangle cu TextureBrush",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,120,50));

r.X=260;
r.Y=10;
g.DrawPie(new Pen(Color.Blue,4),r,10,340);
g.FillPie(new SolidBrush(Color.Red),r,10,340);
g.DrawString("DrawPie FillPie",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
g.DrawLine(new Pen(Color.Cyan,3),r.X,r.Y,r.X+100,r.Y+50);//g.DrawLine(new
Pen(Color.Cyan,3),Point(r.X,r.Y),Point(r.X+100,r.Y+50));-pot fi si valori de tip float
g.DrawString("DrawLine",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
Point P1=new Point(r.X+3,r.Y+35),P2=new Point(r.X+50,r.Y+25),P3=new
Point(r.X+90,r.Y+5),P4=new Point(r.X+99,r.Y+49);
g.DrawBezier(new Pen(Color.Red,2),P1,P2,P3,P4);
g.DrawString("DrawBezier",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
Point[] P={new Point(r.X+3,r.Y+35),new Point(r.X+50,r.Y+25),new
Point(r.X+90,r.Y+5),new Point(r.X+79,r.Y+29),new Point(r.X+99,r.Y+49)};
g.DrawPolygon(new Pen(Color.Red,2),P);
g.FillPolygon(new SolidBrush(Color.Blue),P);
g.DrawString("DrawPolygon FillPolygon",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
g.DrawImage(bm,r);
g.DrawString("DrawImage (complet)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.X=480;

9 lect. dr. Marius Apetrii


Programare orientată pe obiecte Curs 11

r.Y=10;
g.DrawImage(bm,r,30,30,80,40,GraphicsUnit.Pixel);
g.DrawString("DrawImage (partial)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
g.DrawImage(bm,r,110,30,-80,40,GraphicsUnit.Pixel);
g.DrawString("DrawImage (simetrie Oy)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
g.DrawImage(bm,r,30,70,80,-40,GraphicsUnit.Pixel);
g.DrawString("DrawImage (simetrie Ox)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));

r.Y+=70;
g.DrawImage(bm,r,110,70,-80,-40,GraphicsUnit.Pixel);
g.DrawString("DrawImage (simetrie Ox si Oy)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,60));

r.Y+=60;
Point[] Q={new Point(r.X+3,r.Y+25),new Point(r.X+60,r.Y+5),new
Point(r.X+40,r.Y+45)};
g.DrawImage(bm,Q);//cu trei puncte ce descriu trei dintre punctele unui
paralelogram
g.DrawString("DrawImage (vector puncte)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,120,50));

bm.RotateFlip(RotateFlipType.Rotate90FlipX);
r.Y+=60;
g.DrawImage(bm,r);
g.DrawString("DrawImage (RotateFlip)",f,Brushes.Blue,new
RectangleF(r.X+110,r.Y,100,50));
g.Dispose();

Exemplu (click aici pentru download)

10 lect. dr. Marius Apetrii

S-ar putea să vă placă și