Sunteți pe pagina 1din 20

Elemente de grafica pe calculator Laborator nr.

Lucrarea nr. 2

Elemente de grafic n C#

1. Scopul lucrrii:

Lucrarea de fata i propune familiarizarea cu lucrul in mod grafic in limbajul C#:


fundamentele proiectrii grafice GDI, alegerea culorilor, tratarea erorilor, realizarea figurilor
grafice de baza.

2. Noiuni teoretice:

Microsoft Visual Studio .NET limbajul C#

Introducere

C# face parte, alturi de Java, dintr-o nou generaie de limbaje bazate pe paradigma
programrii orientate obiect. El permite programatorului s dezvolte n mod elegant aplicaii
complexe cu ajutorul unui set puternic de instrumente. n mediul de dezvoltare pentru C#
programatorul i poate alege obiectele care trebuie s fac parte din interfaa grafic cu
mouse-ul i apoi le poate deplasa n fereastr, astfel nct s extind interfaa n mod vizual i
nu numai prin cod. Nucleul acestei tehnologii este programarea bazat pe componente de
dimensiuni reduse, uor de construit i de folosit. Pe lng faptul c Visual Studio .NET este
ideal pentru crearea foarte rapid a unor aplicaii Windows, el permite de asemenea folosirea
tuturor trsturilor avansate ale limbajului C++, precum i a funciilor Windows API. Ca o
extensie a Visual Studio 6, este posibil i scrierea de cod MFC.
Clasele obiectelor din GUI au anumite funcii: meniu, timer, textbox, buton. Ele sunt
introduse pur i simplu n proiect i n continuare se folosesc metodele i proprietile lor, iar
comunicarea cu sistemul de operare Windows se realizeaz transparent pentru programator.

Aspectul general

Cnd este creat un nou proiect C# de tip Windows Application, apare o fereastr cu
toate caracteristicile setate implicit n Windows. n mijlocul ecranului, apare o form
(Form) fereastra principal a programului, n care se vor aduga diverse componente de
control: butoane, textbox-uri etc.:
Elemente de grafica pe calculator Laborator nr.2

n partea din stnga a ecranului exist un toolbar (ViewToolbox, Ctrl+Alt+X) din care se
vor alege cu mouse-ul componentele ce vor fi adugate n fereastr.
Pentru adugarea unei componente, programatorul va face click cu mouse-ul pe
imaginea corespunztoare din toolbox, apoi va face click n form, n locul unde dorete s
apar componenta respectiv. Odat introduse n fereastr, componentele pot fi mutate,
redimensionate, copiate sau terse. n dreapta este o fereastr de proprieti (ViewProperties
Window, F4). De aici, fiecrei componente folosite i se pot modifica proprietile, adic
aspectul exterior, aa cum va aprea n program. De asemenea, se pot selecta evenimentele
corespunztoare componentei care vor fi tratate n program.

Clase uzuale pentru interfa


n continuare, vor fi prezentate cteva componente de control folosite practic n orice
program Windows. Pentru fiecare component, vor fi amintite unele proprieti i metode
uzuale. Pentru o descriere mai amnunit, se recomand consultarea Help-ului.

Application

Clasa Application ncapsuleaz o aplicaie Windows. Clasa nglobeaz metode i


proprieti statice pentru managementul unei aplicaii, cum ar fi metode pentru pornirea i
oprirea programului, prelucrarea mesajelor Windows i proprieti corespunztoare
informaiilor despre aplicaie. Se poate observa c n scheletul de program creat implicit de
mediul de dezvoltare, n Main(), este pornit programul pe baza clasei corespunztoare
ferestrei principale:
Application.Run(new Form1());
Form
Elemente de grafica pe calculator Laborator nr.2

Clasa System.Windows.Forms.Form corespunde unei ferestre standard. O aplicaie


poate avea mai multe ferestre una principal, cteva secundare i cteva ferestre de dialog.
Cteva proprieti:
9 Icon icon-ul care apare n bara de titlu a ferestrei
9 FormBorderStyle nfiarea i comportamentul border-ului (de exemplu, dac
fereastra poate fi redimensionat)
9 Text titlul ferestrei, care apare n bara de titlu i n taskbar
9 StartPosition locul unde apare fereastra pe ecran
9 Size dimensiunea (nlimea i limea ferestrei); de obicei se stabilete prin
redimensionarea ferestrei cu mouse-ul, n procesul de proiectare
Cteva evenimente:
9 Load, Closed pentru diverse iniializri n momentul crerii ferestrei sau prelucrri n
momentul nchiderii acesteia

n general, pentru tratarea unui eveniment n C#, este selectat mai nti obiectul de tipul dorit
(la noi fereastra), apoi n fereastra de proprieti se alege tab-ul de evenimente i se
identific evenimentul cutat.

Dup un dublu-click, ca n figura de mai sus, se va crea automat o nou funcie vid
corespunztoare evenimentului, iar utilizatorul va trebui numai s scrie n corpul funciei
aciunile dorite.

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


Cteva proprieti i evenimente:
9 Text textul nscris pe buton
9 Click funcia executat cnd butonul este apsat

Clasa System.Windows.Forms.Label nscrie un text undeva n fereastr.


Una din proprieti:
9 Text textul nscris
Elemente de grafica pe calculator Laborator nr.2

Clasa System.Windows.Forms.TextBox corespunde unei csue de editare text.


Cteva proprieti i evenimente:
9 Text textul din editbox (de tip string, explicat mai jos)
9 Multiline textul poate fi introdus pe o singur linie (false) sau pe mai multe (true)
9 ScrollBars indic prezena unor bare de derulare (orizontale, verticale) dac
proprietatea Multiline este true
9 Enabled componenta este activat sau nu (true/false)
9 ReadOnly textul din editbox poate fi modificat sau nu de utilizator (true/false)
9 CharacterCasing textul poate aprea normal (Normal), numai cu litere mici (Lower)
sau numai cu litere mari (Upper)
9 TextChanged funcie de tratare a textului n timp real, pe msur ce acesta este
introdus.

Clasa System.Windows.Forms.ComboBox corespunde unui combo-box, care combin


un textbox cu o list.
Cteva proprieti i evenimente:
9 Text textul din partea de editare
9 Items lista de obiecte din partea de selecie, care se poate introduce i prin
intermediul ferestrei de proprieti
9 SelectedIndex numrul articolului din list care este selectat (0 primul, 1al
doilea, -1 dac textul din partea de editare nu este ales din list)
9 TextChanged, SelectedIndexChanged metode de tratare a schimbrii textului prin
introducerea direct a unui nou cuvnt sau prin alegerea unui obiect din list

Clasa System.Windows.Forms.MainMenu corespunde meniului unei ferestre. Mod de


folosire:
9 se introduce o component de acest tip n fereastr
9 se editeaz meniul, direct n fereastr sau folosind proprietile
9 pentru separatori se introduce n cmpul Caption un minus ( )
9 literele care se vor subliniate vor fi precedate de &
9 pentru implementarea metodei de tratare a unei opiuni din meniu se va face dublu-
click pe aceasta (sau pe evenimentul Click n fereastra de proprieti).

Clasa System.Windows.Forms.Timer ncapsuleaz funciile de temporizare din


Windows API.
Cteva proprieti i evenimente:
Elemente de grafica pe calculator Laborator nr.2

9 Interval intervalul de timp (n milisecunde) la care va fi executat o funcie


9 Enabled indic dac timer-ul e activat sau nu (true/false)
9 Tick evenimentul care va fi tratat o dat la un interval de timp

Grafic n C#
Pentru lucrul n mod grafic, C# pune la dispoziia programatorului o clas numit
Graphics. Spaiul de nume System.Drawing furnizeaz accesul la proprietile grafice GDI+
de baz pentru programatorii de C# n Windows. GDI+ permite utilizarea elementelor
sofisticate de grafic pentru jocuri i alte medii grafice bogate. Spaiul de nume
System.Drawing furnizeaz clase administrative care ncapsuleaz funcionalitatea 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 SCOP


Bitmap ncapsuleaz un bitmap GDI+.
De la aceast clas de baz sunt derivate clasele pentru definirea
obiectelor care pot fi folosite pentru a umple formele grafice
Brush
nchise. Formele pot fi elipse, poligoane, felii de plcint,
dreptunghiuri, etc.
Brushes Furnizeaz pensule pentru toate culorile standard.
ColorConverter Convertete 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 Convertete cursorul de la un tip de date la altul.
Cursors Definete cursoarele standard.
Definete proprietile fonturilor pentru text. Acestea sunt aspectul
Font
fontului, dimensiunea i atributele de stil.
FontConverter Convertete fonturile de la un tip de date la altul.
Definete un grup de fonturi cu design similar i cu variaii minore
FontFamily
de stil.
Graphics ncapsuleaz o suprafa de desen GDI+.
Icon Reprezint o pictogram.
IconConverter Convertete o pictogram de la un tip de date la altul.
Furnizeaz funcionalitate pentru bitmap-uri, cursoare, pictograme
Image
i metafiiere.
ImageAnimator Suport animaia imaginilor.
ImageConverter Convertete o imagine de la un tip de date la altul.
ImageFormatConverter Convertete culorile de la un tip de date la altul.
Definete proprietile peniei pentru desenarea obiectelor, cum ar
Pen
fi arce de cerc, linii, dreptunghiuri i multe altele.
Pens Furnizeaz penie n toate culorile standard.
PointConverter Convertete un punct de la un tip de date la altul.
RectangleConverter Convertete un dreptunghi de la un tip de date la altul.
Descrie interiorul unei forme grafice compuse din dreptunghiuri i
Region
ci.
Elemente de grafica pe calculator Laborator nr.2

SizeConverter Convertete o dimensiune de la un tip de date la altul.


SolidBrush Definete o pensul de o singur culoare.
ncapsuleaz informaii despre layout-ul textului, cum ar fi
StringFormat
alinierea, spaiul dintre rnduri i alte trsturi.
Definete pensule pentru sistemul extins de culori specific
SystemBrushes
Windows.
Ofer acces la culorile sistemului extins specific
SystemColors Windows.SystemPens i SystemBrushes sunt preferate fa de
SystemColors.
Definete obiectele pictogram pentru sistemul extins de
SystemIcons
pictograme specific Windows.
Definete penie pentru culorile selectate ale sistemului extins
SystemPens
specific Windows.
ncapsuleaz o pensul care utilizeaz o imagine pentru umplerea
TextureBrush
unei forme nchise.
ToolboxBitmapAttribute Definete imaginile utilizate cu o component specificat.

2. Structuri utilizate de clasele grafice:

STRUCTUR SCOP
Color Definete o culoare ARGB.
Definete o pereche ordonat de coordonate x i y. Aceste
Point
coordonate definesc un punct ntr-un plan bidimensional.
Definete o pereche ordonat de coordonate x i y n virgul mobil.
PointF Aceste coordonate definesc, de asemenea, un punct ntr-un plan
bidimensional.
Stocheaz localizarea i dimensiunile pentru o regiune
Rectangle
dreptunghiular.
Stocheaz localizarea i dimensiunile pentru o regiune
RectangleF
dreptunghiular, definit prin valori n virgul mobil.
Definete dimensiunea unei regiuni dreptunghiulare, cu o pereche
Size
ordonat de valori pentru lime i nlime.
Definete dimensiunea unei regiuni dreptunghiulare, cu o pereche
SizeF
ordonat de valori n virgul mobil pentru lime i nlime.

3. Enumerrile folosite de clasele grafice:

ENUMERAREA SCOP
BrushStyle Furnizeaz o varietate de siluri pentru pensule.
ContentAlignment Furnizeaz alinierea coninutului pe o suprafa de desen.
FontStyle Furnizeaz informaii de stil pentru text.
GraphicsUnit Furnizeaz o unitate de msur pentru date.
KnownColor Furnizeaz culorile sistemului.
PenStyle Definete stilurile penielor.
Identific modul de umplere a poligoanelor formate din regiunile de
PolyFillMode
suprapunere.
Furnizeaz alinierea unui string text n raport cu dreptunghiul de
StringAlignment
layout.
Elemente de grafica pe calculator Laborator nr.2

Furnizeaz informaii asupra stilului aplicat la String Digit


StringDigitSubstitute
Substitute.
StringFomatFlags Furnizeaz informaiile de afiare i layout pentru stringul text.
StringTrimming nltur caracterele dintr-un string cnd acesta nu ncape n layout.
StringUnit Furnizeaz unitile de msur pentru un string text.

Exist i clase tot att de puternice ca i cele furnizate de spaiul de nume


System.Drawing pentru suportul GDI+ al capabilitilor grafice i care nu sunt furnizate de
acest spaiu de nume. Accesarea acestor clase este oferit de spaiul de nume
System.Drawing.Drawing2D. Acesta furnizeaz 2 funcionaliti avansate de grafic
bidimensional i vectorial pentru GDI+.

Clasa Graphics pentru C#

Aceast clas se ntrebuineaz pentru ncapsularea unei suprafee de desen GDI+. n


plus, furnizeaz o arie cuprinztoare 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 dintre
aplicaiile Windows scrise n C#, metoda OnPaint() va fi suprascris, n scopul de a permite
funcionarea diverselor clase grafice. De exemplu, urmtoarea poriune de cod ndeplinete
aceast sarcin. Poriunea de cod prezentat cu un font accentuat este direct legat de
suprascrierea 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 conine informaiile despre evenimentul Paint. Un


eveniment Paint este declanat ori de cte ori se schimb afiajul vizual al controlului sau
formularului. Cnd se ntmpl asta, este expediat un apel sau un mesaj pentru control sau
formular ctre metoda OnPaint.

4. Metode comune disponibile pentru desen i destinaia utilizrii n cadrul caselor


grafice:

METODA DESTINAIA
Furnizeaz o nou instan a clasei grafice, folosind o administrare
FromHDC pentru contextul dispozitivului (HDC Handle to the Device
Context).
FromHWND Furnizeaz o nou instan a clasei grafice,folosind o administrare
Elemente de grafica pe calculator Laborator nr.2

pentru fereastr (HWND Handle to the Window).


Genereaz o instan a unei clase grafice, folosind o imagine
FromImage
existent.
GetHalftonePalette Livreaz o palet n semiton (halftone).

5. Metode cu instane publice. Tabelul conine cea mai mare parte a primitivelor de
desen utilizate pentru crearea arcurilor de cerc, a liniilor, a elipselor, a
dreptunghiurilor, .a.m.d.

METODA SCOP
Copiaz comentariul dintr-un buffer ntr-un metafiier cu format
AddMetafileComment
mbuntit.
BeginContainer Furnizeaz nceputul unui container de metafiier.
Clear Cur aria prin umplerea suprafeei de desen cu o culoare dat.
Dispose terge grafica i elibereaz memoria alocat.
DrawArc Traseaz un arc de la o specificaie 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 definete curba.
DrawCurve Traseaz o curb. Curba este definit printr-o matrice de puncte.
DrawEllipse Traseaz o elips.
DrawIcon Traseaz o imagine iconic.
Traseaz o imagine iconic. Aceast metod alungete imaginea la
DrawIconUnstretched dimensiunile date, permind utilizatorului s furnizeze un
dreptunghi drept cadru al imaginii de desenat.
DrawImage Traseaz o imagine.
Traseaz o imagine. Aceast metod alungete imaginea la
DrawImageUnscaled dimensiunile date, permind utilizatorului s furnizeze un
dreptunghi drept cadru al imaginii de desenat.
DrawLine Traseaz o linie.
Traseaz o serie de segmente de dreapt. Segmentele se
DrawLines
conecteaz ntr-un tablou de puncte.
DrawPath Traseaz linii i curbe definite printr-un GraphicsPath.
DrawPie Traseaz conturul unei felii de plcint (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 sfritul unui container de metafiier.
EnumerateMetafile Enumereaz un fiier.
Equals Afl dac obiectul utilizat reprezint aceeai instan ca i obiectul
(motenit de la Object) curent.
ExcludeClip Specific regiunea decupat pentru excludere.
Umple interiorul unei curbe nchise specificate printr-un tablou de
FillClosedCurve
puncte.
Umple interiorul unei elipse specificate printr-un dreptunghi
FillEllipse
mrginitor.
FillPath Umple interiorul unei ci.
Elemente de grafica pe calculator Laborator nr.2

FillPie Umple interiorul unei felii de plcint.


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 operaiile aflate curent pe stiv.
Acioneaz ca o funcie Hash pentru un tip particular. Poate fi
GetHashCode
utilizat n hashing de algoritmi ca tabel de hash.
Obine administrarea pentru contextul dispozitivului (DC Device
GetHDC
Context) asociat cu clasa grafic.
Returneaz un obiect lifetime service n scopul de a controla
GetLifetimeService
gestionarea timpului de funcionare.
Gsete culoarea solid care se potrivete cel mai bine la o culoare
GetNearestColor
logic specificat.
GetType Furnizeaz tipul unui obiect dat.
Permite obiectelor s furnizeze propria concesiune i, astfel,
InitializeLifetimeService
controlul asupra propriului timp de funcionare.
Intersect Clip D specificaiile pentru intersecia regiunii decupate.
Comunic dac obiectul sau obiectele selectate sunt vizibile n
IsVisible
cadrul panoului.
Returneaz o dimensiune n virgul mobil pentru stringul
MeasureString
msurat.
MeasureStringRegion Returneaz regiunea stringului msurat.
Multiplic matricea pentru transformarea universal cu o matrice
MultiplyTransform
dat.
ReleaseHDC Returneaz memoria alocat pentru HDC.
ResetClip Reiniializeaz regiunea decupat pentru obiect.
Reiniializeaz transformarea universal la transformarea
ResetTransform
identitate.
Restore Reiniializeaz starea grafic.
RotateTransform Rotete 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.
Specific punctele de transformare utilizate de ctre matricea de
TransformPoints
transformare.
Furnizeaz informaia de translatare pentru regiunea decupat a
TranslateClip
obiectului.
TranslateTransform Translateaz matricea de transformare.
Tabelul 9.9 Metode cu instane 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,
Elemente de grafica pe calculator Laborator nr.2

sunt, de obicei, msurate de la partea superioar i din partea stng a ecranului.


Diferitele standarde grafice au mrit rezoluia sau numrul de pixeli n oricare dintre direciile
date.
De exemplu, monitoarele CGA au avut rezoluia de culoare de 320 x 200 pixeli, care
reprezint 320 de pixeli, ncepnd cu 0 n stnga i terminnd cu 319 n dreapta, respectiv 200
de pixeli, pornind cu 0 n partea superioar i terminnd cu 199 n partea inferioar (de jos) a
ecranului.
VGA a crescut rezoluia la 640 x 480, iar acum SVGA i alte standarde au fcut un
salt cantitativ. Cnd Microsoft a proiectat sistemul de operare Windows, a decis s-l fac
independent de dispozitiv. Asta nseamn c atunci cnd doreti un cerc cu o raz fixat, el
va aprea la fel pe monitoarele CGA i VGA, fr programare suplimentar, care s
suprasolicite programatorul. Implicit, sistemul de coordonate utilizat n limbajul C# pentru
grafic este sistemul de coordonate n pixeli descris mai sus.
Pentru investigarea valorilor coordonatelor n diverse locaii pe suprafaa unui
formular creat n C# se procedeaz astfel:
Se creeaz un formular n C# i pe acesta se plaseaz 2 etichete (label), ca n
figura de mai jos.
Se adaug un eveniment MouseMove, scopul fiind acela de a returna
coordonatele X i Y ale poziiilor mouse-ului ctre cele 2 controale Label.
Poriunea de cod a programului care realizeaz acest lucru este urmtoarea:

private void Form1_MouseMove(object sender,


System.Windows.Forms.MouseEventArgs e)
{
label1.Text = e.X.ToString();
label2.Text = e.Y.ToString();
}

Pe msur ce mouse-ul este micat n suprafaa client a formularului, valorile X i Y


sunt raportate la cele 2 controale Label.

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

Proprietile grafice

Proprietile grafice se refer la aspecte cum ar fi trasarea i culorile de umplere, stilul


liniilor, grosimile liniilor i stilul de umplere. Combinaia corect de culori i stiluri creeaz
un efect vizual plcut pentru diagrame i grafice.

Culori

Culorile pentru desen sunt specificate prin crearea penielor de desen, iar culorile de
umplere sunt specificate prin crearea pensulelor. Peniele de desen contureaz formele, n
timp ce pensulele sunt utilizate pentru a umple cu culoare interiorul unor forme nchise. De
Elemente de grafica pe calculator Laborator nr.2

exemplu, o simpl peni albastr poate fi creat pornind de la clasa Pen cu urmtoarea
sintax:
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 folosete metoda Dispose(). De exemplu
n cazul lui redpen, aceast metod se implementeaz astfel:
Redpen.Dispose();

Stiluri de trasare a liniilor

Cnd este creat o nou peni pornind de la clasa Pen, penia va trasa o linie solid,
de grosime prestabilit sau specificat. Dup crearea peniei, C# pentru Windows permite
schimbarea 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 DESCRIERE


Custom Permite un stil de liniue personalizat, definit de utilizator.
Dash Traseaz o linie alctuit dintr-o serie de liniue.
Traseaz o linie alctuit dintr-o serie de alternane liniu-
DashDot
punct.
Traseaz o linie alctuit dintr-o serie de alternane liniu-
DashDotDot
punct-punct.
Dot Traseaz o linie alctuit 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 UMPLERII


BackwardDiagonal Traseaz linii pe diagonal de la dreapta-sus la stnga-jos.
Cross Traseaz linii ncruciate orizontale i verticale.
DiagonalCross Traseaz linii ncruciate diagonale.
ForwardDiagonal Traseaz linii pe diagonal de la stnga-sus la dreapta-jos.
Horizontal Traseaz linii orizontale.
Vertical Traseaz linii verticale.

Ex: Crem o pensul haurat cu un stil de haurare ncruciat. Se stabilete 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);
Elemente de grafica pe calculator Laborator nr.2

Primitive grafice de desen

Toate formele grafice sunt trasate pornind de la o colecie predefinit de


metode numite primitive de desen. Aceste primitive de desen sunt descrise pe scurt n
tabelul 9.9 i dintre acestea vom prezenta cteva 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 direcia x i 100 de
//pixeli n direcia y.
g.DrawRectangle(bluepen, rect);
LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red,
Color.Yellow, LinearGradientMode.BackwardDiagonal);
g.FillRectangle(lBrush, rect);//metoda FillRectangle umple interiorul
//dreptunghiului cu o culoare dat.
}

Metoda DrawLine este utilizat pentru a trasa o linie care unete 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 plcint. Felia
este definit printr-o elips i dou linii radiale (raze).
Metoda FillPie este utilizat pentru umple interiorul unei felii de plcint. Felia este
definit 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 afiat.


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 unete dou sau mai multe puncte. n exemplul de
mai jos prima curba, C1, include numai dou puncte. C2 include trei puncte. C3
include 4 puncte.
Elemente de grafica pe calculator Laborator nr.2

O curba poate fi trasat n GDI+ utiliznd metoda Graphics.DrawCurve(). Pentru a


se putea trasa curba mai nti 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);


}
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 cte puncte vor fi ignorate nainte de a ncepe trasarea
liniei. Dac acesta argument, spre exemplu, are valoarea 1 atunci primul punct nu va fi
considerat n trasare. Mai departe se poate specifica numrul de segmente. Acesta trebuie s
fie mai mic dect numrul 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);


}
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 Bzier

Curbele Bzier sunt curbe parametrice cubice n care se folosesc patru puncte de control, P0,
P1 , P2 , P3 , iar funciile de baz sunt funciile Bzier, care au urmtoarele expresii:

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

Rezult expresia polinomial a curbelor Bzier:


Q(u) = P0(1-u)3 + 3P1u(1-u)2 + 3P2u(1-u) + 3P3u3
Punctele P1 i P2 se numesc puncte de control deoarece poziia lor n spaiu
influeneaz forma curbei. Punctele de control acioneaz aidoma unor magnei, ce trag curba
spre ele. P0 i P3 sunt capetele curbei. Poligonul obinut prin unirea punctelor succesive se
numete poligon caracteristic sau poligon de control. n sensul definiiei date poligonului
acesta 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 Bzier este:
controlul global al formei curbelor.

Curbe Bzier. Reprezentare grafic:


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 proprietile curbelor Bzier

private void pictureBox2_Paint(object sender,


System.Windows.Forms.PaintEventArgs e)
{
Elemente de grafica pe calculator Laborator nr.2

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

//deseneaza tulpina dinspre coltul stanga-jos spre centru


e.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 florii


float fScale = Math.Min (cx,cy)/1500f;//returneaza valoarea minima
dintre cx si cy impartita la 2000
e.Graphics.TranslateTransform(cx/2,cy/2);
e.Graphics.ScaleTransform(fScale,fScale);

//deseneaza petale rosii


GraphicsPath path = new GraphicsPath();//reprezentare serii de linii
si curbe conectate
path.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<12;i++)
{

e.Graphics.FillPath(Brushes.Red,path);
e.Graphics.DrawPath(Pens.Black,path);
e.Graphics.RotateTransform(360/12);
}
//deseneaza cerc galben in centru
Rectangle rect = new Rectangle(-150,-
150,300,300);
e.Graphics.FillEllipse(Brushes.Yellow,rect)
;
e.Graphics.DrawEllipse(Pens.Black,rect);
}

Serii de curbe Bzier

protected override void OnPaint(PaintEventArgs pe)


{
Graphics g = pe.Graphics;
g.FillRectangle(new SolidBrush(Color.White), ClientRectangle);
GraphicsPath path = new GraphicsPath(new Point[] {
new Point(40, 140), new Point(275, 200),
new Point(105, 225), new Point(190, 300),
new Point(50, 350), new Point(20, 180), },
new byte[] {
(byte)PathPointType.Start,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Line,
(byte)PathPointType.Line,
});
PathGradientBrush pgb = new PathGradientBrush(path);
pgb.SurroundColors = new Color[] { Color.Green,Color.Yellow,Color.Red, Color.Blue,
Color.Orange, Color.Coral, };
g.FillPath(pgb, path);
}
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 calcul


al poziiilor unor planete la un moment dat. Deoarece nu exist un moment special, la care
toate planetele s fie aliniate, vom considera ca referin o dat arbitrar, la care configuraiile
lor sunt cunoscute i vom calcula apoi poziiile n jurul Soarelui (longitudinile) la o dat
introdus de utilizator.
Elemente de grafica pe calculator Laborator nr.2

Vom considera programul mprit n 2 module independente, care n final vor fi


reunite. Fiecare modul va fi implementat printr-o clas, cu diferite metode (funcii) i
proprieti (variabile). Ideea de baz a programrii modulare este c modulele sunt realizate
cvasi-independent, de persoane diferite, care nu au nevoie s neleag celelalte componente.
Un modul trebuie s funcioneze ca un obiect de sine stttor, care s fie uor 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 foarte
dificil depistarea i corectarea acestora.
Structura general a celor dou module este urmtoarea:

Cele dou module sunt implementate n clasele Zile.cs i Planete.cs. Interfaa


aplicaiei este prezentat n figura de mai jos:

Funcia asociat butonului Calculeaza este urmtoarea:

DateTime data = new DateTime(1, 1, 1);


private void button5_Click(object sender, EventArgs e)
{
int zi, luna, an;
if (textBox3.Text == "")
{
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 funcia afiare():
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. Desfurarea lucrrii:

1. Se va citi breviarul teoretic. Se atrage atenia asupra faptului c aceste informaii vor fi
folosite i la desfurarea altor lucrri de laborator.
2. Se vor studia exemplele prezentate pe parcursul acestui laborator urmrind efectul
rulrii acestora i buna lor execuie.
3. Se va ncerca gsirea altor posibiliti de soluionare a problemelor propuse.
4. Pentru aplicaia de astronomie, s se afieze data cnd dou planete alese de utilizator
sunt la distan minim/maxim.

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