elemente de grafica in C++

Embed Size (px)

Citation preview

  • 8/16/2019 elemente de grafica in C++

    1/20

    Elemente de grafica pe calculator Laborator nr.2

    Lucrarea nr. 2

    Elemente de grafică în C#

    1.   Scopul lucr ării:

    Lucrarea de fata îşi propune familiarizarea cu lucrul in mod grafic in limbajul C#:fundamentele proiectării grafice GDI, alegerea culorilor, tratarea erorilor, realizarea figurilorgrafice de baza.

    2.   No ţ iuni teoretice:

    Microsoft Visual Studio .NET – limbajul C#

    Introducere

    C# face parte, alături de Java, dintr-o nouă generaţie de limbaje bazate pe paradigma programării orientate obiect. El permite programatorului să dezvolte în mod elegant aplicaţiicomplexe cu ajutorul unui set puternic de instrumente. În mediul de dezvoltare pentru C#

     programatorul îşi poate alege obiectele care trebuie să  facă  parte din interfaţa grafică  cumouse-ul şi apoi le poate deplasa în fereastr ă, astfel încât să extindă interfaţa în mod vizual şinu numai prin cod. Nucleul acestei tehnologii este programarea bazată  pe componente dedimensiuni reduse, uşor de construit şi de folosit. Pe lângă faptul că Visual Studio .NET esteideal pentru crearea foarte rapidă a unor aplicaţii Windows, el permite de asemenea folosireatuturor tr ăsăturilor avansate ale limbajului C++, precum şi a funcţiilor Windows API. Ca oextensie a Visual Studio 6, este posibilă şi scrierea de cod MFC.

    Clasele obiectelor din GUI au anumite funcţii: meniu, timer, textbox, buton. Ele suntintroduse pur

    şi simplu în proiect

    şi în continuare se folosesc metodele

    şi propriet

    ăţile lor, iar

    comunicarea cu sistemul de operare Windows se realizează transparent pentru programator.

    Aspectul general

    Când este creat un nou proiect C# de tip Windows Application, apare o fereastr ă cutoate caracteristicile setate implicit în Windows. În mijlocul ecranului, apare o „formă”(Form) – fereastra principală  a programului, în care se vor adăuga diverse componente decontrol: butoane, textbox-uri etc.:

  • 8/16/2019 elemente de grafica in C++

    2/20

    Elemente de grafica pe calculator Laborator nr.2

    În partea din stânga a ecranului există un toolbar (View→Toolbox, Ctrl+Alt+X) din care sevor alege cu mouse-ul componentele ce vor fi adăugate în fereastr ă.

    Pentru adăugarea unei componente, programatorul va face click cu mouse-ul peimaginea corespunzătoare din toolbox, apoi va face click în formă, în locul unde doreşte să apar ă  componenta respectivă. Odată  introduse în fereastr ă, componentele pot fi mutate,redimensionate, copiate sau şterse. În dreapta este o fereastr ă de proprietăţi (View→ PropertiesWindow, F4). De aici, fiecărei componente folosite i se pot modifica proprietăţile, adică aspectul exterior, aşa cum va apărea în program. De asemenea, se pot selecta evenimentelecorespunzătoare componentei care vor fi tratate în program.

    Clase uzuale pentru interfaţă 

    În continuare, vor fi prezentate câteva componente de control folosite practic în orice program Windows. Pentru fiecare componentă, vor fi amintite unele proprietăţi şi metodeuzuale. Pentru o descriere mai amănunţită, se recomandă consultarea Help-ului.

    Application

    Clasa  Application încapsulează  o aplicaţie Windows. Clasa înglobează  metode şi proprietăţi statice pentru managementul unei aplicaţii, cum ar fi metode pentru pornirea şi

    oprirea programului, prelucrarea mesajelor Windows şi proprietăţi corespunzătoareinformaţiilor despre aplicaţie. Se poate observa că  în scheletul de program creat implicit demediul de dezvoltare, în  Main(), este pornit programul pe baza clasei corespunzătoareferestrei principale:

     Application.Run(new Form1());Form

  • 8/16/2019 elemente de grafica in C++

    3/20

    Elemente de grafica pe calculator Laborator nr.2

    Clasa System.Windows.Forms.Form corespunde unei ferestre standard. O aplicaţie poate avea mai multe ferestre – una principală, câteva secundare şi câteva ferestre de dialog.Câteva proprietăţi:  Icon – icon-ul care apare în bara de titlu a ferestrei  FormBorderStyle – înf ăţişarea şi comportamentul border-ului (de exemplu, dacă 

    fereastra poate fi redimensionată)

      Text – titlul ferestrei, care apare în bara de titlu şi în taskbar  StartPosition – locul unde apare fereastra pe ecran  Size – dimensiunea (înălţimea şi lăţimea ferestrei); de obicei se stabileşte prin

    redimensionarea ferestrei cu mouse-ul, în procesul de proiectareCâteva evenimente:  Load, Closed – pentru diverse iniţializări în momentul creării ferestrei sau prelucr ări în

    momentul închiderii acesteia

    În general, pentru tratarea unui eveniment în C#, este selectat mai întâi obiectul de tipul dorit(la noi – fereastra), apoi în fereastra de proprietăţi se alege tab-ul de evenimente şi seidentifică evenimentul căutat.

    După un dublu-click, ca în figura de mai sus, se va crea automat o nouă funcţie vidă corespunzătoare evenimentului, iar utilizatorul va trebui numai să  scrie în corpul funcţieiacţiunile dorite.

    Clasa System.Windows.Forms.Button corespunde unei buton.

    Câteva proprietăţi şi evenimente:  Text – textul înscris pe buton  Click – funcţia executată când butonul este apăsat

    Clasa System.Windows.Forms.Label înscrie un text undeva în fereastr ă.Una din proprietăţi:

      Text  – textul înscris 

  • 8/16/2019 elemente de grafica in C++

    4/20

    Elemente de grafica pe calculator Laborator nr.2

    Clasa System.Windows.Forms.TextBox corespunde unei căsuţe de editare text.Câteva proprietăţi şi evenimente:  Text – textul din editbox (de tip string, explicat mai jos)  Multiline – textul poate fi introdus pe o singur ă linie (false) sau pe mai multe (true)  ScrollBars – indică  prezenţa unor bare de derulare (orizontale, verticale) dacă 

     proprietatea Multiline este true  Enabled – componenta este activată sau nu (true/false)  ReadOnly – textul din editbox poate fi modificat sau nu de utilizator (true/false)  CharacterCasing – textul poate apărea normal (Normal), numai cu litere mici (Lower)

    sau numai cu litere mari (Upper)  TextChanged – funcţie de tratare a textului în timp real, pe măsur ă  ce acesta este

    introdus.

    Clasa System.Windows.Forms.ComboBox corespunde unui combo-box, care combină un textbox cu o listă.Câteva proprietăţi şi evenimente:  Text – textul din partea de editare  Items – lista de obiecte din partea de selec ţie, care se poate introduce şi prin

    intermediul ferestrei de proprietăţi  SelectedIndex – numărul articolului din listă  care este selectat (0 →  primul, 1→al

    doilea, -1 dacă textul din partea de editare nu este ales din listă)  TextChanged, SelectedIndexChanged – metode de tratare a schimbării textului prin

    introducerea directă a unui nou cuvânt sau prin alegerea unui obiect din listă 

    Clasa System.Windows.Forms.MainMenu corespunde meniului unei ferestre. Mod defolosire:  se introduce o componentă de acest tip în fereastr ă   se editează meniul, direct în fereastr ă sau folosind proprietăţile   pentru separatori se introduce în câmpul Caption un minus („ – ”)  literele care se vor subliniate vor fi precedate de „&”   pentru implementarea metodei de tratare a unei opţiuni din meniu se va face dublu-

    click pe aceasta (sau pe evenimentul Click în fereastra de proprietăţi).

    Clasa System.Windows.Forms.Timer încapsulează  funcţiile de temporizare dinWindows API.Câteva proprietăţi şi evenimente:

  • 8/16/2019 elemente de grafica in C++

    5/20

    Elemente de grafica pe calculator Laborator nr.2

      Interval – intervalul de timp (în milisecunde) la care va fi executată o funcţie  Enabled – indică dacă timer-ul e activat sau nu (true/false)  Tick – evenimentul care va fi tratat o dată la un interval de timp

    Grafică în C#Pentru lucrul în mod grafic, C# pune la dispoziţia programatorului o clasă  numită 

    Graphics. Spaţiul de nume System.Drawing  furnizează accesul la proprietăţile grafice GDI+de bază  pentru programatorii de C# în Windows. GDI+ permite utilizarea elementelorsofisticate de grafică  pentru jocuri şi alte medii grafice bogate. Spaţiul de numeSystem.Drawing furnizează  clase administrative care încapsulează  funcţionalitatea noii

     biblioteci grafice GDI+. Aici, obiectul Graphics ofer ă metode pentru a desena arce, elipse,linii, puncte şi chiar stringuri.

    1.  Clase grafice: furnizează metodele pentru desenare pe monitor.

     NUME CLASĂ  SCOPBitmap Încapsulează un bitmap GDI+.

    Brush

    De la această clasă de bază sunt derivate clasele pentru definireaobiectelor care pot fi folosite pentru a umple formele graficeînchise. Formele pot fi elipse, poligoane, felii de plăcintă,dreptunghiuri, etc.

    Brushes Furnizează pensule pentru toate culorile standard.ColorConverter Converteşte o culoare de la un tip de date la altul.ColorTranslator Translatează culorile la sau de la obiectele Color GDI+.Cursor Reprezintă imaginea cursorului.CursorConverter Converteşte cursorul de la un tip de date la altul.Cursors Defineşte cursoarele standard.

    FontDefineşte proprietăţile fonturilor pentru text. Acestea sunt aspectulfontului, dimensiunea şi atributele de stil.

    FontConverter Converteşte fonturile de la un tip de date la altul.

    FontFamilyDefineşte un grup de fonturi cu design similar şi cu variaţii minorede stil.

    Graphics Încapsulează o suprafaţă de desen GDI+.Icon Reprezintă o pictogramă.IconConverter Converteşte o pictogramă de la un tip de date la altul.

    ImageFurnizează funcţionalitate pentru bitmap-uri, cursoare, pictogrameşi metafişiere.

    ImageAnimator Suportă animaţia imaginilor.

    ImageConverter Converteşte o imagine de la un tip de date la altul.ImageFormatConverter Converteşte culorile de la un tip de date la altul.

    PenDefineşte proprietăţile peniţei pentru desenarea obiectelor, cum arfi arce de cerc, linii, dreptunghiuri şi multe altele.

    Pens Furnizează peniţe în toate culorile standard.PointConverter Converteşte un punct de la un tip de date la altul.RectangleConverter Converteşte un dreptunghi de la un tip de date la altul.

    RegionDescrie interiorul unei forme grafice compuse din dreptunghiuri şicăi.

  • 8/16/2019 elemente de grafica in C++

    6/20

    Elemente de grafica pe calculator Laborator nr.2

    SizeConverter Converteşte o dimensiune de la un tip de date la altul.SolidBrush Defineşte o pensulă de o singur ă culoare.

    StringFormatÎncapsulează informaţii despre layout-ul textului, cum ar fialinierea, spaţiul dintre rânduri şi alte tr ăsături.

    SystemBrushesDefineşte pensule pentru sistemul extins de culori specificWindows.

    SystemColorsOfer ă acces la culorile sistemului extins specificWindows.SystemPens şi SystemBrushes sunt preferate faţă deSystemColors.

    SystemIconsDefineşte obiectele pictogramă pentru sistemul extins de

     pictograme specific Windows.

    SystemPensDefineşte peniţe pentru culorile selectate ale sistemului extinsspecific Windows.

    TextureBrushÎncapsulează o pensulă care utilizează o imagine pentru umplereaunei forme închise.

    ToolboxBitmapAttribute Defineşte imaginile utilizate cu o componentă specificată.

    2.   Structuri utilizate de clasele grafice: 

    STRUCTUR Ă  SCOPColor Defineşte o culoare ARGB.

    PointDefineşte o pereche ordonată de coordonate x şi y. Acestecoordonate definesc un punct într-un plan bidimensional.

    PointFDefineşte o pereche ordonată de coordonate x şi y în virgulă mobilă.Aceste coordonate definesc, de asemenea, un punct într-un plan

     bidimensional.

    RectangleStochează localizarea şi dimensiunile pentru o regiunedreptunghiular ă.

    RectangleF Stochează localizarea şi dimensiunile pentru o regiunedreptunghiular ă, definită prin valori în virgulă mobilă.

    SizeDefineşte dimensiunea unei regiuni dreptunghiulare, cu o perecheordonată de valori pentru lăţime şi înălţime.

    SizeFDefineşte dimensiunea unei regiuni dreptunghiulare, cu o perecheordonată de valori în virgulă mobilă pentru lăţime şi înălţime.

    3.   Enumer ările folosite de clasele grafice: 

    ENUMERAREA SCOPBrushStyle Furnizează o varietate de siluri pentru pensule.

    ContentAlignment Furnizează alinierea conţinutului pe o suprafaţă de desen.FontStyle Furnizează informaţii de stil pentru text.GraphicsUnit Furnizează o unitate de măsur ă pentru date.KnownColor Furnizează culorile sistemului.PenStyle Defineşte stilurile peniţelor.

    PolyFillModeIdentifică modul de umplere a poligoanelor formate din regiunile desuprapunere.

    StringAlignmentFurnizează alinierea unui string text în raport cu dreptunghiul delayout.

  • 8/16/2019 elemente de grafica in C++

    7/20

    Elemente de grafica pe calculator Laborator nr.2

    StringDigitSubstituteFurnizează informaţii asupra stilului aplicat la String DigitSubstitute.

    StringFomatFlags Furnizează informaţiile de afişare şi layout pentru stringul text.StringTrimming Înlătur ă caracterele dintr-un string când acesta nu încape în layout.StringUnit Furnizează unităţile de măsur ă pentru un string text.

    Există  şi clase tot atât de puternice ca şi cele furnizate de spaţiul de numeSystem.Drawing  pentru suportul GDI+ al capabilităţilor grafice şi care nu sunt furnizate deacest spaţiu de nume. Accesarea acestor clase este oferită  de spaţiul de numeSystem.Drawing.Drawing2D. Acesta furnizează  2 funcţionalităţi avansate de grafică 

     bidimensională şi vectorială pentru GDI+.

    Clasa Graphics pentru C#

    Această clasă se întrebuinţează pentru încapsularea unei suprafeţe de desen GDI+. În plus, furnizează o arie cuprinzătoare de metode şi accesorii, numite primite de desen GDI+.Prin folosirea metodelor ca DrawLine, FillPie şi multe altele, poate să  fie desenată  pe un

    control sau un formular o imagine de aproape orice formă grafică. În cele mai multe dintreaplicaţiile Windows scrise în C#, metoda OnPaint() va fi suprascrisă, în scopul de a permitefuncţionarea diverselor clase grafice. De exemplu, următoarea por ţiune de cod îndeplineşteaceastă  sarcină. Por ţiunea de cod prezentată  cu un font accentuat este direct legată  desuprascrierea metodei.

    protected override void OnPaint(PaintEventArgs e)

    {Graphics g = e.Graphics;

    Brush redbrush = new SolidBrush(Color.Red);Font ArialFont = new Font(„Arial”,14);

    string test = „Aceasta este prima aplicatie de grafica in C#”;string antet = „Laborator: Elemente de grafica pe calculator!”;

    g.DrawString(antet, ArialFont, redbrush, 25, 5);

    g.DrawString(test, ArialFont, redbrush, 25, 35);

    }

    În acest caz, clasa PaintEventArgs conţine informaţiile despre evenimentul Paint . Uneveniment Paint este declanşat ori de câte ori se schimbă  afişajul vizual al controlului sauformularului. Când se întâmplă  asta, este expediat un apel sau un mesaj pentru control sauformular către metoda OnPaint .

    4.   Metode comune disponibile pentru desen şi destina ţ ia utiliz ării în cadrul caselor grafice: 

    METODA DESTINAŢIA

    FromHDCFurnizează o nouă instanţă a clasei grafice, folosind o administrare

     pentru contextul dispozitivului (HDC – Handle to the DeviceContext ).

    FromHWND Furnizează o nouă instanţă a clasei grafice,folosind o administrare

  • 8/16/2019 elemente de grafica in C++

    8/20

    Elemente de grafica pe calculator Laborator nr.2

     pentru fereastr ă (HWND – Handle to the Window).

    FromImageGenerează o instanţă a unei clase grafice, folosind o imagineexistentă.

    GetHalftonePalette Livrează o paletă în semiton (halftone).

    5.   Metode cu instan ţ e publice. Tabelul con ţ ine cea mai mare parte a primitivelor dedesen utilizate pentru crearea arcurilor de cerc, a liniilor, a elipselor, a

    dreptunghiurilor, ş .a.m.d. 

    METODA SCOP

    AddMetafileCommentCopiază comentariul dintr-un buffer într-un metafişier cu formatîmbunătăţit.

    BeginContainer Furnizează începutul unui container de metafişier.Clear Cur ăţă aria prin umplerea suprafeţei de desen cu o culoare dată.Dispose Şterge grafica şi eliberează memoria alocată.DrawArc Trasează un arc de la o specificaţie de elipsă dată.

    DrawBezier Trasează o curbă cubică Bezier.DrawBeziers Trasează o serie de curbe cubice Beziers.DrawClosedCurve Trasează o curbă închisă. O matrice de curbe defineşte curba.DrawCurve Trasează o curbă. Curba este definită printr-o matrice de puncte.DrawEllipse Trasează o elipsă.DrawIcon Trasează o imagine iconică.

    DrawIconUnstretchedTrasează o imagine iconică. Această metodă alungeşte imaginea ladimensiunile date, permiţând utilizatorului să furnizeze undreptunghi drept cadru al imaginii de desenat.

    DrawImage Trasează o imagine.

    DrawImageUnscaledTrasează o imagine. Această metodă alungeşte imaginea ladimensiunile date, permiţând utilizatorului să furnizeze un

    dreptunghi drept cadru al imaginii de desenat.DrawLine Trasează o linie.

    DrawLinesTrasează o serie de segmente de dreaptă. Segmentele seconectează într-un tablou de puncte.

    DrawPath Trasează linii şi curbe definite printr-un GraphicsPath.DrawPie Trasează conturul unei felii de plăcintă ( pie section).DrawPolygon Trasează conturul unui poligon.DrawRectangle Trasează conturul unui dreptunghi.DrawRectangles Trasează conturul unei serii de dreptunghi.DrawString Trasează un string.EndContainer Furnizează sfâr şitul unui container de metafişier.

    EnumerateMetafile Enumerează un fişier.Equals(moştenită de la Object)

    Află dacă obiectul utilizat reprezintă aceeaşi instanţă ca şi obiectulcurent.

    ExcludeClip Specifică regiunea decupată pentru excludere.

    FillClosedCurveUmple interiorul unei curbe închise specificate printr-un tablou de

     puncte.

    FillEllipseUmple interiorul unei elipse specificate printr-un dreptunghimărginitor.

    FillPath Umple interiorul unei căi.

  • 8/16/2019 elemente de grafica in C++

    9/20

    Elemente de grafica pe calculator Laborator nr.2

    FillPie Umple interiorul unei felii de plăcintă.FillPolygon Umple interiorul unui poligon specificat cu un tablou de puncte.FillRectangle Umple interiorul unui dreptunghi cu o pensulă.FillRectangles Umple interiorul unei serii de dreptunghiuri cu o pensulă.FillRegion Umple interiorul unei regiuni.Flush Execută toate operaţiile aflate curent pe stivă.

    GetHashCode Acţionează ca o funcţie Hash pentru un tip particular. Poate fiutilizată în hashing  de algoritmi ca tabel de hash.

    GetHDCObţine administrarea pentru contextul dispozitivului (DC – DeviceContext ) asociat cu clasa grafică.

    GetLifetimeServiceReturnează un obiect lifetime service în scopul de a controlagestionarea timpului de funcţionare.

    GetNearestColorGăseşte culoarea solidă care se potriveşte cel mai bine la o culoarelogică specificată.

    GetType Furnizează tipul unui obiect dat.

    InitializeLifetimeServicePermite obiectelor să furnizeze propria concesiune şi, astfel,controlul asupra propriului timp de funcţionare.

    Intersect Clip Dă specificaţiile pentru intersecţia regiunii decupate.IsVisible

    Comunică dacă obiectul sau obiectele selectate sunt vizibile încadrul panoului.

    MeasureStringReturnează o dimensiune în virgulă mobilă pentru stringulmăsurat.

    MeasureStringRegion Returnează regiunea stringului măsurat.

    MultiplyTransformMultiplică matricea pentru transformarea universală cu o matricedată.

    ReleaseHDC Returnează memoria alocată pentru HDC.ResetClip Reiniţializează regiunea decupată pentru obiect.

    ResetTransformReiniţializează transformarea universală la transformareaidentitate.

    Restore Reiniţializează starea grafică.RotateTransform Roteşte matricea de transformare.Save Salvează starea grafică.ScaleTransform Scalează matricea de transformare.SetClip Setează regiunea decupată pentru obiect.ToString Returnează un string care reprezintă obiectul curent.

    TransformPointsSpecifică punctele de transformare utilizate de către matricea detransformare.

    TranslateClipFurnizează informaţia de translatare pentru regiunea decupată aobiectului.

    TranslateTransform Translatează matricea de transformare.

    Tabelul 9.9 Metode cu instanţe publice

    Sistemul de coordonate

    Multe limbaje de la început au folosit cele mai mici elementele de pe ecran posibile pentru a descrie coordonatele de ecran şi scalele de desen. Aceste elemente, numite pixeli,

  • 8/16/2019 elemente de grafica in C++

    10/20

    Elemente de grafica pe calculator Laborator nr.2

    sunt, de obicei, măsurate de la partea superioară  şi din partea stângă  a ecranului.Diferitele standarde grafice au mărit rezoluţia sau numărul de pixeli în oricare dintre direcţiiledate.

    De exemplu, monitoarele CGA au avut rezoluţia de culoare de 320 x 200 pixeli, carereprezintă 320 de pixeli, începând cu 0 în stânga şi terminând cu 319 în dreapta, respectiv 200de pixeli, pornind cu 0 în partea superioar ă şi terminând cu 199 în partea inferioar ă (de jos) a

    ecranului.VGA a crescut rezoluţia la 640 x 480, iar acum SVGA şi alte standarde au f ăcut un

    salt cantitativ. Când Microsoft a proiectat sistemul de operare Windows, a decis să-l facă ”independent de dispozitiv”. Asta înseamnă că atunci când doreşti un cerc cu o rază fixată, elva apărea la fel pe monitoarele CGA şi VGA, f ăr ă  programare suplimentar ă, care să suprasolicite programatorul. Implicit, sistemul de coordonate utilizat în limbajul C# pentrugrafică este sistemul de coordonate în pixeli descris mai sus.

    Pentru investigarea valorilor coordonatelor în diverse locaţii pe suprafaţa unuiformular creat în C# se procedează astfel:

    •  Se creează un formular în C# şi pe acesta se plasează 2 etichete (label), ca înfigura de mai jos.

    •  Se adaugă  un eveniment  MouseMove, scopul fiind acela de a returna

    coordonatele X şi Y ale poziţiilor mouse-ului către cele 2 controale Label.•  Por ţiunea de cod a programului care realizează acest lucru este următoarea:

    private void Form1_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)

    { label1.Text = e.X.ToString();label2.Text = e.Y.ToString();

    Pe măsur ă ce mouse-ul este mişcat în suprafaţa client a formularului, valorile X şi Ysunt raportate la cele 2 controale Label.

    //********************************************************************

    Proprietăţile grafice

    Proprietăţile grafice se refer ă la aspecte cum ar fi trasarea şi culorile de umplere, stilul

    liniilor, grosimile liniilor şi stilul de umplere. Combinaţia corectă de culori şi stiluri creează un efect vizual plăcut pentru diagrame şi grafice.

    Culori

    Culorile pentru desen sunt specificate prin crearea peniţelor de desen, iar culorile deumplere sunt specificate prin crearea pensulelor. Peniţele de desen conturează  formele, întimp ce pensulele sunt utilizate pentru a umple cu culoare interiorul unor forme închise. De

  • 8/16/2019 elemente de grafica in C++

    11/20

    Elemente de grafica pe calculator Laborator nr.2

    exemplu, o simplă  peniţă  albastr ă  poate fi creată  pornind de la clasa Pen cu următoareasintaxă:

    Pen bluepen = new Pen(Color.Blue);

    O peniţă care trasează linii de orice grosime specificată poate fi creată astfel:Pen redpen = new Pen(Color.Red, 25); 

    O pensulă simplă de culoare galbenă solidă poate fi creată pornind de la clasa Brush astfel:Brush yellowbrush = new SolidBrush(Color.Yellow); 

    Pentru a elibera orice instanţă ale acestor clase se foloseşte metoda Dispose(). De exempluîn cazul lui redpen, această metodă se implementează astfel:

    Redpen.Dispose(); 

    Stiluri de trasare a liniilor

    Când este creată o nouă peniţă pornind de la clasa Pen, peniţa va trasa o linie solidă,de grosime prestabilită  sau specificată. După  crearea peniţei, C# pentru Windows permiteschimbarea stilului acesteia.

    Pen bluepen = new Pen(Color.Blue, 10);//trasează cu o liniuţă şi două puncte bluepen.DashStyle = DashStyle.DashDotDot;

    bluepen.StartCap = LineCap.ArrowAnchor;

    DENUMIREA STILULUI DESCRIERECustom Permite un stil de liniuţe personalizat, definit de utilizator.Dash Trasează o linie alcătuită dintr-o serie de liniuţe.

    DashDotTrasează o linie alcătuită dintr-o serie de alternanţe liniuţă-

     punct.

    DashDotDotTrasează o linie alcătuită dintr-o serie de alternanţe liniuţă-

     punct-punct.Dot Trasează o linie alcătuită dintr-o serie de puncte.Solid Trasează o linie plină.

    Stiluri de umplere cu pensula

    Formele ca dreptunghiuri, cercuri, elipse pot fi umplute cu o culoare şi un model.Stilul de umplere poate varia de la o pensulă de culoare solidă la careuri pe diagonală.

    DENUMIREA STILULUI DESCRIEREA UMPLERIIBackwardDiagonal Trasează linii pe diagonală de la dreapta-sus la stânga-jos.Cross Trasează linii încrucişate orizontale şi verticale.DiagonalCross Trasează linii încrucişate diagonale.ForwardDiagonal Trasează linii pe diagonală de la stânga-sus la dreapta-jos.Horizontal Trasează linii orizontale.

    Vertical Trasează linii verticale.

    Ex: Creăm o pensulă haşurată cu un stil de haşurare încrucişat. Se stabileşte culoarea de prim plan la magenta şi culoarea de fundal la alb.

    Brush magentabrush = new HatchBrush(HatchStyle.Cross, Color.Magenta,Color.White);g.FillRectangle(magentabrush, 100, 550, 500,100);

  • 8/16/2019 elemente de grafica in C++

    12/20

    Elemente de grafica pe calculator Laborator nr.2

    Primitive grafice de desen

    Toate formele grafice sunt trasate pornind de la o colecţie predefinită  demetode numite primitive de desen. Aceste primitive de desen sunt descrise pe scurt întabelul 9.9 şi dintre acestea vom prezenta câteva dintre cele mai folosite.

    Metoda DrawRectangle – este utilizată pentru a trasa conturul unui dreptunghi.

    Ex.: protected override void OnPaint(PaintEventArgs pe) { Graphics g = pe.Graphics ; Rectangle rect = new Rectangle(50, 30, 100, 100);  //punctul de început pentru

     //dreptunghi este 50, 30. Dreptunghiul se extinde 100 de pixeli pe direc ţ ia x  şi 100 de

     //pixeli în direc ţ ia y.g.DrawRectangle(bluepen, rect);

    LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red,Color.Yellow, LinearGradientMode.BackwardDiagonal);  

    g.FillRectangle(lBrush, rect); // m e t o d a Fi l lR e ct a n g l e   umple interiorul

     //dreptunghiului cu o culoare dat ă. } 

    Metoda DrawLine – este utilizată pentru a trasa o linie care uneşte două puncte date.Metoda DrawArc – este utilizată pentru a trasa un arc dintr-o elipsă specificată.Metoda DrawEllipse – este utilizată pentru a trasa conturul unei elipse.Metoda FillEllipse – este utilizată pentru a umple interiorul unei elipse.Metoda DrawPie – este utilizată pentru a trasa conturul unei felii de plăcintă. Feliaeste definită printr-o elipsă şi două linii radiale (raze).Metoda FillPie – este utilizată pentru umple interiorul unei felii de plăcintă. Felia estedefinită printr-o elipsă şi două linii radiale (raze).Metoda DrawString – este utilizată pentru a trasa un string pe un formular.Ex:

    DrawString (string s, Font font, Brush brush, int x, int y)

    •  Primul parametru este textul care trebuie afişat.•  Al doilea parametru reprezintă  tipul de litere cu care se va desena şirul de

    caractere. De exemplu:Font font = new Font("Arial", 10);

    •  Al treilea parametru este utilizat pentru trasarea efectivă a textului.•  Ultimii doi parametri sunt coordonatele ecran.

    Metoda DrawCurve – o linie care uneşte două sau mai multe puncte. În exemplul demai jos prima curba, C1, include numai două  puncte. C2 include trei puncte. C3include 4 puncte.

  • 8/16/2019 elemente de grafica in C++

    13/20

    Elemente de grafica pe calculator Laborator nr.2

    O curba poate fi trasată în GDI+ utilizând metoda Graphics.DrawCurve(). Pentru ase putea trasa curba mai întâi trebuie precizate punctele Point sau PointF.

    private void Form1_DoubleClick(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);Point[] pt = { new Point(40, 42), new Point(188, 246),

    new Point(484, 192), new Point(350, 48) };

    graph.DrawCurve(penCurrent, pt); }

    private void Form1_DoubleClick(object sender, System.EventArgs e)

    {Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);Point[] pt = { new Point(40, 42), new Point(188, 246),

    new Point(484, 192), new Point(350, 48) };

    graph.DrawCurve(penCurrent, pt, 0.00F);}

  • 8/16/2019 elemente de grafica in C++

    14/20

    Elemente de grafica pe calculator Laborator nr.2

    private void Form1_DoubleClick(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);PointF[] pt = { new PointF(20F, 322F), new PointF(124, 24),

    new PointF(214, 242), new PointF(275, 28),new PointF(380F, 322F) };

    graph.DrawCurve(penCurrent, pt);

    }

    public void DrawCurve(Pen pen,PointF[] points,int offset ,int numberOfSegments);

    Argumentul offset specifică  câte puncte vor fi ignorate înainte de a începe trasarealiniei. Dacă  acesta argument, spre exemplu, are valoarea 1 atunci primul punct nu va ficonsiderat în trasare. Mai departe se poate specifica numărul de segmente. Acesta trebuie să 

    fie mai mic decât numărul maxim de segmente posibile.

    private void Form1_DoubleClick(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);PointF[] pt = { new PointF(20F, 322F), new PointF(124, 24),

    new PointF(214, 242), new PointF(275, 28),new PointF(380F, 322F) };

    graph.DrawCurve(penCurrent, pt, 1, 2);}

  • 8/16/2019 elemente de grafica in C++

    15/20

    Elemente de grafica pe calculator Laborator nr.2

    Trasare curbe închise.

    private void Form1_DoubleClick(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Red);Point[] pt = { new Point(40, 42), new Point(188, 246),

    new Point(484, 192), new Point(350, 48) };

    graph.DrawClosedCurve(penCurrent, pt);}

    Trasare curbe Bézier

    Curbele Bézier sunt curbe parametrice cubice în care se folosesc patru puncte de control, P0,P1 , P2 , P3 , iar funcţiile de bază sunt funcţiile Bézier, care au următoarele expresii:

    B0(u) = (1+u)3 

    B1(u) = 3u(1-u)2B2(u) = 3u2(1-u)B3(u) = 3u3 

    Rezultă expresia polinomială a curbelor Bézier:Q(u) = P0(1-u)

    3 + 3P1u(1-u)2 + 3P2u(1-u) + 3P3u

    3 Punctele P1  şi P2  se numesc puncte de control deoarece poziţia lor în spaţiu

    influenţează forma curbei. Punctele de control acţionează aidoma unor magneţi, ce trag curbaspre ele. P0  şi P3 sunt capetele curbei. Poligonul obţinut prin unirea punctelor succesive senumeşte  poligon caracteristic  sau  poligon de control .  În sensul definiţiei date poligonuluiacesta ar trebui închis cu ultimul segment, de la P3  la P0, însă, în general, acest segment al

     poligonului caracteristic nu se reprezintă. Principalul dezavantaj al curbelor Bézier este:controlul global al formei curbelor .

    Curbe Bézier. Reprezentare grafică:

  • 8/16/2019 elemente de grafica in C++

    16/20

    Elemente de grafica pe calculator Laborator nr.2

    private void button1_Click(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);Point pt1 = new Point(20, 12),

    pt2 = new Point(88, 246),pt3 = new Point(364, 192),pt4 = new Point(250, 48);

    graph.DrawBezier(penCurrent, pt1, pt2, pt3, pt4);

    }

    Desenare floare folosind proprietăţile curbelor Bézier

    private void pictureBox2_Paint(object sender,System.Windows.Forms.PaintEventArgs e){

  • 8/16/2019 elemente de grafica in C++

    17/20

    Elemente de grafica pe calculator Laborator nr.2

    int cx,cy;cx = 100; cy = pictureBox2.Height-40;

    //deseneaza tulpina dinspre coltul stanga-jos spre centrue.Graphics.DrawBezier(new Pen(Color.Green,10),

    new Point(0,cy), new Point(0,3*cy/4),new Point(cx/4,cy/4),new Point(cx/2,cy/2));

    //stabileste transformarea pentru restul floriifloat fScale = Math.Min (cx,cy)/1500f;//returneaza valoarea minimadintre cx si cy impartita la 2000e.Graphics.TranslateTransform(cx/2,cy/2);e.Graphics.ScaleTransform(fScale,fScale);

    //deseneaza petale rosiiGraphicsPath path = new GraphicsPath();//reprezentare serii de liniisi curbe conectatepath.AddBezier(new Point(0,0),new Point(125,125),

    new Point(475,125),new Point(600,0));path.AddBezier(new Point(600,0),new Point(475,-125),

    new Point(125,-125),new Point(0,0));for(int i=0;i

  • 8/16/2019 elemente de grafica in C++

    18/20

    Elemente de grafica pe calculator Laborator nr.2

    private void button1_Click(object sender, System.EventArgs e){

    Graphics graph = this.CreateGraphics();Pen penCurrent = new Pen(Color.Blue);Point[] pt = { new Point( 10, 5), new Point(340, 60),

    new Point(320, 148), new Point(150, 120),new Point(24, 220), new Point(250, 150),new Point(304, 240) };

    graph.DrawBeziers(penCurrent, pt);}

    În continuare, propunem realizarea unui program de astronomie, mai precis, de calculal poziţiilor unor planete la un moment dat. Deoarece nu există un moment special, la caretoate planetele să fie aliniate, vom considera ca referinţă o dată arbitrar ă, la care configuraţiilelor sunt cunoscute şi vom calcula apoi poziţiile în jurul Soarelui (longitudinile) la o dată introdusă de utilizator.

  • 8/16/2019 elemente de grafica in C++

    19/20

    Elemente de grafica pe calculator Laborator nr.2

    Vom considera programul împăr ţit în 2 module independente, care în final vor fireunite. Fiecare modul va fi implementat printr-o clasă, cu diferite metode (funcţii) şi

     proprietăţi (variabile). Ideea de bază a programării modulare este că modulele sunt realizatecvasi-independent, de persoane diferite, care nu au nevoie să înţeleagă celelalte componente.Un modul trebuie să  funcţioneze ca un obiect de sine stătător, care să  fie uşor integrabil în

     proiectul general. De aceea, fiecare modul trebuie testat pentru a i se asigura corectitudinea.

    Dacă  în unele module există  erori nedetectate, după  integrarea lor în sistem va fi foartedificilă depistarea şi corectarea acestora.Structura generală a celor două module este următoarea:

    Cele două  module sunt implementate în clasele  Zile.cs  şi  Planete.cs. Interfaţaaplicaţiei este prezentată în figura de mai jos:

    Funcţia asociată butonului “Calculeaza” este următoarea:

    DateTime data = new DateTime(1, 1, 1);private void button5_Click(object sender, EventArgs e){

    int zi, luna, an;if (textBox3.Text == ""){

  • 8/16/2019 elemente de grafica in C++

    20/20

    Elemente de grafica pe calculator Laborator nr.2

    MessageBox.Show("Introduceti ziua");textBox3.Focus();

    }else if (textBox5.Text == ""){

    MessageBox.Show("Introduceti ziua");textBox3.Focus();

    }else if (comboBox2.SelectedIndex == -1){

    MessageBox.Show("Introduceti luna");comboBox2.Focus();comboBox2.DroppedDown = true;

    }else{

    zi = Convert.ToInt32(this.textBox3.Text);luna = Convert.ToInt32(this.comboBox2.SelectedIndex + 1);an = Convert.ToInt32(this.textBox5.Text);data = new DateTime(an, luna, zi);afisare();

    }

    }Apelul claselor Zile.cs şi Planete.cs se face din funcţia afi şare():void afisare(){

    zile z = new zile(data);planete pl = new planete(z.Diferenta);this.textBox4.Text = "";for (int i = 0; i < pl.NumarPlanete; i++)

    this.textBox4.Text += "Planeta " + pl.Nume[i] + " este la" + pl.Longitudine[i] + ((char)(13)) + ((char)(10));

    3. Desf ăşurarea lucr ării:

    1.  Se va citi breviarul teoretic. Se atrage atenţia asupra faptului că aceste informaţii vor fifolosite şi la desf ăşurarea altor lucr ări de laborator.

    2.  Se vor studia exemplele prezentate pe parcursul acestui laborator urmărind efectulrulării acestora şi buna lor execuţie.

    3.  Se va încerca găsirea altor posibilităţi de soluţionare a problemelor propuse.4.  Pentru aplicaţia de astronomie, să se afişeze data când două planete alese de utilizator

    sunt la distanţă minimă/maximă.