Programare Windows I – Visual C

++

Curs 9

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

verde şi albastru (valori cuprinse între 0 şi 255). cum ar fi: alinierea şi spaţierea liniilor. PointF P2(23. RectangleF R3(24.7. 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.2). Accesul la aceste coordonate se face prin intermediul proprietăţilor Width şi Height.23.7.7. dr.7F.100). SizeF SolidBrush StringFormat TextureBrush Curs 9 Descrierea Structurile de tip întreg sau în virgulă mobilă care reprezintă o dimensiune. Green. ce definesc un punct în plan.S2(P1). Încapsulează un set de informaţii de machetare a textelor.Y. 2 lect. O pensulă care utilizează o imagine pentru a umple formele. Accesul la aceste coordonate se face prin intermediul proprietăţilor X şi Y. Utilizarea culorilor Culorile sunt reprezentate de structura System::Drawing::Color şi sunt formate din patru componente: Red.25. Exemplu: Rectangle R1(0.100). Width. R2(P1. ce definesc de obicei lăţimea şi înălţimea unui dreptunghi.5. Height. Marius Apetrii .5. O pensulă care utilizează o culoare pentru a umple formele. Blue şi Alpha.7. Structurile Rectangle şi RectangleF Reţin un set de patru întregi/numere în virgulă mobilă care reprezintă locaţia şi dimensiunea unui dreptunghi. Exemplu: Point P1(25.R4(P2.23F).S4(P2). Accesul la aceste valori se face prin intermediul proprietăţilor X.100.S3). Structurile Size şi SizeF Reprezintă o pereche de întregi/numere în virgulă mobilă. Exemplu: Size S1(25.23.100).S1).Programare Windows I – Visual C++ Clasa Size. Primele trei reprezintă cantităţile de roşu. Structurile Point şi PointF Reprezintă o pereche ordonată de întregi/numere în virgulă mobilă.23F).7F. SizeF S3(23. Cantitatea Alpha reprezintă transparenţa culorii şi poate varia între 0 (complet transparent) şi 255 (complet opac).

public: Font(String.R. //o culoare semitransparentă Observaţie: Proprietăţile A.rosu. Italic Name Strikeout Dă o valoare care indică dacă fontul are aplicat stilul italic. Green. Time New Roman).Programare Windows I – Visual C++ Curs 9 Nu există constructor definit dar se pot utiliza metodele statice FromArgb.construiește un nou font utilizând un font existent și o enumerare FontStyle.R. public: Font(String. Red. o FromArgb – crează o culoare dintr-un set de valori Alpha. Single. Utilizarea fonturilor Pentru a utiliza fonturile într-un program vom folosi clasa System::Drawing::Font. FromKnownColor.66.construiește un nou font pornind de la o familie de fonturi și de la o dimensiune speificată. Marius Apetrii . .33. Exemple : Color rosu=Color::FromArgb(255. Un font se poate defini specificând familia (ex. Proprietăţi specifice Nume Bold Descriere Dă o valoare care indică dacă fontul are aplicat stilul bold. FontStyle). Dă numele fontului. 3 lect. rosu. dimensiunea și stilul.G.//o culoare semi-transparentă Color rosu_semitransparent = Color::FromArgb(127.G şi B pot fi utilizate pentru a accesa componentele obiectului Color. dr.0. FontStyle). o FromKnownColor – crează un obiect Color dintr-un membru al enumerării KnownColor. Printre constructorii clasei avem: public: Font(Font.B). FromName pentru a crea obiecte Color.rosu.0).99). de la o dimensiune speificată și de la o enumerare FontStyle. o FromName – crează un obiect pornind de la un nume.construiește un nou font pornind de la o familie de fonturi. Dă o valoare care indică dacă textul care va fi scris utilizând acest font este tăiat cu o linie orizontală. . . Blue. FontFamily Dă valoarea FontFamily asociată fontului. Single).//o culoare opaca Color c = Color::FromArgb(110.

. specificând un argument Brush în loc de Color. Observaţie: Clasa Pens are proprietăţi care definesc peste 140 de creioane ce reprezintă gama completă de culori definite de sistem.//crează un creion negru cu laţimea prestabilită de un pixel Pen^ pen2=gcnew Pen(Color::Red..0).//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.//crează o pensulă albastră Clasa TextureBrush utilizează o imagine pentru umplerea formelor.//latimea textului ms. Fiecare dintre acestea are lăţimea de un pixel. toate provenind din clasa de bază Brush.Programare Windows I – Visual C++ Style Underline Dă informații despre stilul fontului. Obiecte Brush Obiectele Brush sunt de mai multe feluri. ms. Exemplu: SolidBrush^ br1=gcnew SolidBrush(Color::Blue).f). Astfel se pot umple liniile cu imagini sau modele. Exemple: Pen^ pen1=gcnew Pen(Color::Black). care umple o suprafaţă cu o culoare omogenă. Dă o valoare care indică dacă fontul are aplicat stilul underline. Curs 9 Observație: Pentru a determina dimensiunile unui anumit text într-un context grafic se poate folosi metoda MeasureString din clasa Graphics. Marius Apetrii .Height. dr. SizeF ms.Width. ca in exemplul de mai jos: Graphics ^g. Font ^f. poate fi multiplicată pe toată suprafaţa formei: 4 lect. ms=g->MeasureString("text".2. Dacă imaginea este mai mică decât forma. Cel mai simplu obiect este SolidBrush.//crează un creion roşu cu laţimea de doi pixeli Se pot crea şi obiecte Pen mai avansate.

Crează o imagine dintr-un fişier specificat. Dă lăţimea obiectului Image. Marius Apetrii . System::Drawing::Drawing2D::WrapMode::Tile). Icon. Dă rezoluţia orizontală (pixeli-pe-inch) a obiectului Image. Dă formatul obiectului Image: Bmp. Dă adâncimea culorii (numărul de biţi pe pixel) pentru formatul specificat. a imaginii. Proprietăţi Height HorizontalResolution Palette RawFormat Size VerticalResolution Width Dă înălţimea obiectului Image. //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. Dă sau setează paleta de culori utilizată de obiectul Image. Clasa Image Aceasta este o clasă abstractă care stă la baza claselor Bitmap şi Metafile. Crează o imagine dintr-un stream. Dă numărul de frame-uri ale obiectului. Salvează imaginea în formatul specificat. Folosită pentru rotiri şi simetrii ale imaginii.bmp"). Dă sau setează lăţimea şi înălţimea. 5 lect. dr. Overloaded. în pixeli. Gif. Dă rezoluţia verticală (pixeli-pe-inch) a obiectului Image. Selectează frame-ul specificat prin dimensiune şi index. Wmf etc. Jpeg. Metode Clone FromFile FromStream GetFrameCount GetPixelFormatSize RotateFlip Save SelectActiveFrame Crează o copie a obiectului Image.Programare Windows I – Visual C++ Curs 9 Exemplu: TextureBrush^ br2=gcnew TextureBrush(gcnew Bitmap("brush.

public: Bitmap(String^). Exemplu în care încărcăm imaginea aflată la adresa "resurse\\poza. Size).bmp". //redimensionam g->DrawImage(bm.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. // crează un obiect Bitmap dintr-un flux dat.Imaging::ImageFormat::Bmp).300. img->Save("c:\\poza. int).2) devin transparenţi). bm=gcnew Bitmap(bm.0. Pentru crearea obiectelor Bitmap putem folosi constructorii: public: Bitmap(Image^). Bitmap^ bm=gcnew Bitmap("resurse\\poza.Programare Windows I – Visual C++ Curs 9 Exemplu de utilizare a metodei Save: img->Save("c:\\poza.200.250). bm->MakeTransparent(c). int).0.0.300. Setează culoarea pixelului specificat. g->DrawImage(bm. Setează rezoluţia obiectului Bitmap.bmp"). Graphics ^g=p->CreateGraphics().300. Color c=bm->GetPixel(2. public: Bitmap(int.jpg"). Clasa Bitmap Un obiect Bitmap reprezintă o imagine grafică (reprezentată prin pixeli) împreună cu atributele sale. sau public: Bitmap(Image^.200). // crează un obiect Bitmap dintr-un obiect Image existent. Culoarea specificata devine transparenta.2). public: Bitmap(Image^. int. 6 lect. // crează un obiect Bitmap avand la bază fişierul aflat la adresa specificată. Marius Apetrii . // crează un obiect Bitmap de dimensiuni specificate Metode specifice GetPixel MakeTransparent SetPixel SetResolution Dă culoarea pixelului specificat.250). public: Bitmap(Stream^).// crează un obiect Bitmap (de dimensiuni specificate) dintrun obiect Image existent. dr.

Un obiect al acestei clase reprezintă o structură de date fundamentală din Windows. Desenează o curbă Bézier definită printr-un tablou de puncte. Desenează o serie de segmente ce unesc punctele precizate întrun tablou de puncte. este recomandat ca după utilizare. Un obiect Graphics utilizează resurse de sistem care vor fi eliberate din memorie atunci când obiectul este colectat la gunoi. Desenează un arc de elipsă Desenează o curbă Bézier definită prin patru puncte. Desenează imaginea specificată în locaţia precizată. Desenează o elipsă definită de un dreptunghi delimitator. Obiectele clasei Graphics nu sunt create direct ci se obţin cu ajutorul metodei CreateGraphics. Desenează o pictogramă. Desenează o curbă având la bază un tablou de puncte. apelând metoda Dispose: Exemplu: g->Dispose(). denumită context de dispozitiv. Desenează o linie între două puncte precizate. Exemplu: Graphics ^g=formularulMeu->CreateGraphics(). dr. Desenează o curbă închisă definită de un tablou de puncte. Desenează un sector de cerc definit de o elipsă şi două linii radiale. fiind de fapt un intermediar între utilizator şi dispozitivul de ieşire. 7 lect. Clasa Graphics include multe metode. Desenează un obiect GraphicsPath. cele mai des utilizate fiind prezentate în tabelul de mai jos. Eliberează resursele utilizate de obiectul Graphics. Metode Clear Dispose DrawArc DrawBezier DrawBeziers DrawClosedCurve DrawCurve DrawEllipse DrawIcon DrawImage DrawLine DrawLines DrawPath DrawPie Umple întreaga suprafaţă de desenare cu o culoare. resursele să fie eliberate. Cum nu se cunoaşte momentul în care se colectează gunoiul. Marius Apetrii . iar un obiect al clasei Graphics reprezintă locaţia către care se trimite afişarea grafică.Programare Windows I – Visual C++ Curs 9 Clasa Graphics Clasa Graphics suportă operaţii de desenare. dar poate oferi şi informaţii despre dispozitivul utilizat.

Umple interiorul unui dreptunghi. dr. Modul de utilizare a principalelor metode este prezentat în programul următor. Aplică o rotaţie dată de o matrice. Dă dimensiunile unui text. 8 lect. Umple interiorul unui poligon definit de un tablou de puncte. Marius Apetrii .Programare Windows I – Visual C++ DrawPolygon DrawRectangle DrawString FillClosedCurve FillEllipse FillPath FillPie FillPolygon FillRectangle FromImage MeasureString RotateTransform Save Curs 9 Desenează un poligon definit de un tablou de puncte. Umple interiorul unui obiect GraphicsPath. precizîndu-se fontul folosit. Crează un obiect Graphics nou dintr-un obiect Image. Scrie textul specificat în locaţia specificată. Desenează un dreptunghi. Umple interiorul unei curbe închise definită de un tablou de puncte. folosind câte un obiect Brush şi Font. Salvează contextul grafic reprezentat de obiectul curent. Umple interiorul unui sector de cerc definit de o elipsă şi două linii radiale. Umple interiorul unei elipse definită de un dreptunghi delimitator.

100.10. } sender. Adăugăm formularului un control PictureBox pentru care stabilim : BackColor = System::Drawing::Color::White.35).f. Rectangle(10.70.pot fi si valori de tip float 9 lect. g->DrawEllipse(gcnew Pen(Color::Green.//sau g>FillEllipse(new SolidBrush(Color::Yellow).3).50. Adăugăm formularului un control Button pentru care stabilim : Location = System::Drawing::Point(323. Marius Apetrii .//pot fi si valori de tip float g->DrawArc(Pens::Red.100.50).10. dr.90). Name = L"b".120.70. Name = L"p".50).pot fi si valori de tip float g->FillEllipse(gcnew SolidBrush(Color::Yellow). MaximizeBox = false. System::EventArgs^){ Unde metoda desenează este: void deseneaza(Graphics^ g){ Bitmap ^bm=gcnew Bitmap("resurse\\Azul.4). 416).Programare Windows I – Visual C++ Curs 9 Creăm un proiect nou numit MetodeGrafice şi pentru formularul Form1 vom stabili: ClientSize = System::Drawing::Size(738. Text = L"Exemplu de utilizare a metodelor grafice".70.//pot fi si valori de tip float g->DrawString("DrawArc".12).Brushes::Blue. System::Drawing::Font ^f=gcnew System::Drawing::Font("Times New Roman".50).90). 474).10.0.r).//sau g>DrawEllipse(Pens::Red. Location = System::Drawing::Point(10.150.100).//scrie in punctul dat Rectangle r(10.100. Size = System::Drawing::Size(100.100. g->DrawArc(gcnew Pen(Color::Blue. Text = L"Deseneaza".100. 10). 400). 53).10.10.90.50). Pentru evenimentul Click asociat butonului b vom avea: private: System::Void b_Click(System::Object^ deseneaza(p->CreateGraphics()). FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D.jpg").r). bm=gcnew Bitmap(bm. Size = System::Drawing::Size(720.

r.Y+5). r.P2.2).X=260.Y+50).Brushes::Blue.X+110.X+110.f.-pot fi si valori de tip float g->DrawString("DrawLine".Y.50).X.4). g->FillPolygon(gcnew SolidBrush(Color::Blue).r.P3. g->DrawPolygon(gcnew Pen(Color::Red.Y.10.Y+35).P).r.Y+=70.r.3). g->DrawString("FillEllipse cu TextureBrush".r.//am folosit si formatari pentru text r.RectangleF(r.X+110.Brushes::Blue.r).P4(r.Y+49).X. RectangleF(120. r. RectangleF(r.r).P1. g->DrawString("DrawRectangle FillRectangle".P2(r. RectangleF(r.r.r.Point(r.RectangleF(r.3).Y+25).r.100.X+90.Point(r. StringFormat ^sf=gcnew StringFormat(). g->FillRectangle(gcnew SolidBrush(Color::Red).r.Point(r.50)). g->DrawImage(bm.Y.r.X+50.//scrie in zona data r.Y. Point P1(r. r.Y+=70. dr. RectangleF(r.P4). g->DrawLine(gcnew Pen(Color::Cyan.X+7 9.X+99.120.r.r).100. 10 lect.Brushes::Blue. r.r.r). sf->Alignment=StringAlignment::Center.P3(r.X+90.100.Point(r.Programare Windows I – Visual C++ Curs 9 g->DrawString("DrawEllipse FillEllipse".50)).Y.Brushes::Blue.100.r.Y+=70.r.100.Y+=70.f.r.50)).Y+35).X+110. g->DrawBezier(gcnew Pen(Color::Red.sf).P).f. g->FillPie(gcnew SolidBrush(Color::Red).Point(r.r.Y+25).r.Y+50)).2).340).340).Y. r.Point(r.X+100.50)).f.Y+=70.Brushes::Blue.f.10.r.f.//g->DrawLine(new Pen(Color::Cyan.X+50.X+110. RectangleF(r.r.Y).Y+=70.X+3.X+3.r.r.r. g->DrawPie(gcnew Pen(Color::Blue. r.Y+=70.X+110.50)).r.Y=10.Y.f. r. array<Point>^ P={Point(r. g->DrawString("DrawPolygon FillPolygon".Y.X+110. RectangleF(r.Y+5).r).120.50)). g->DrawString("DrawBezier".X+100. g->FillRectangle(gcnew TextureBrush(bm). g->FillEllipse(gcnew TextureBrush(bm).Y+29).Brushes::Blue. Marius Apetrii .70.4).r.X+99. g->DrawString("FillRectangle cu TextureBrush".50)).100.f. g->DrawString("DrawPie FillPie".Y+49)}.Brushes::Blue.Brushes::Blue. g->DrawRectangle(gcnew Pen(Color::Blue.

100.r.Y. RectangleF(r.X+110. g->DrawImage(bm.100.X+110.f. g->DrawString("DrawImage (partial)". g->DrawImage(bm.50)). r.Y+=60.100.110.Y+5).r. g->DrawString("DrawImage (simetrie Ox)".GraphicsUnit::Pixel). r.X+110.r.Y+45)}.Y+=60.40.-40.100.X+110.Point(r.Y+=70.120.Y. Marius Apetrii .Brushes::Blue.50)). RectangleF(r.40.Y+=70.Q).r.X+110.Y.r.80.70. RectangleF(r.X+3.Y+=70.X+60.50)). r.f.Brushes::Blue.50)).f.r).GraphicsUnit::Pixel). g->DrawString("DrawImage (simetrie Ox si Oy)".Y+25).Y.r. Curs 9 r. g->DrawImage(bm.r.100. g->DrawImage(bm.Brushes::Blue.80.GraphicsUnit::Pixel).Y.X+110.Programare Windows I – Visual C++ g->DrawString("DrawImage (complet)".f. } 11 lect.100.-40.Point(r.f. r.60)).r.//cu trei puncte ce descriu trei dintre punctele unui paralelogram g->DrawString("DrawImage (vector puncte)". RectangleF(r. g->DrawImage(bm. bm->RotateFlip(RotateFlipType::Rotate90FlipX). RectangleF(r. array<Point> ^Q={Point(r.GraphicsUnit::Pixel).r.Brushes::Blue.Brushes::Blue. g->DrawImage(bm. RectangleF(r.Y=10.X=480. RectangleF(r.r.50)).f.f.30.30.r.30.50)).110.X+40.-80.Y.r.X+110.Brushes::Blue.Brushes::Blue. g->DrawString("DrawImage (simetrie Oy)".-80. r.30.70.Y.r. g->DrawString("DrawImage (RotateFlip)". r.r. dr.

Sign up to vote on this title
UsefulNot useful