Sunteți pe pagina 1din 20

14.

Clasa butoanelor.
Clasa butoanelor este o clas predefinit ce permite crearea controalelor de
tip ferestre descendent sub form de butoane. Existena clasei ntr-unul dintre
fiierele Windows permite crearea butoanelor direct prin apelarea funciei
CreateWindow, nefiind necesar inregistrarea clasei de fereastr.
Clasa butoanelor are o procedur de fereastr (aflat ntr-una dintre
bibliotecile cu legturi dinamice ale sistemului de operare) care prelucreaz
mesajele trimise ctre ferestrele butoanelor, ceea ce determin ca toate
butoanele s reacioneze ntr-un mod similar la anumite aciuni ale
utilizatorului(de ex: schimbarea culorii n cazul apasrii). Procedura ferestrei
buton din Windows execut ntreinerea acestor butoane i toate operaiile
de redesenare.
Stsitemul de operare este responsabil de interpretarea click-urilor de
mouse, redesenarea butonului sau de modul n care butonul se mic atunci
cnd este apsat. Sarcina programatorului este s intercepteze mesajul
WM_COMMAND - acesta este modul n care butonul informeaz procedura
ferestrei despre declanarea unui eveniment.
15.Coduri virtuale de taste. Starea tastelor de modificare. Utilizarea mesajelor
de acionare a tastelor.
Fiecare tast este identificat de un numr numit cod virtual. Acest cod
virtual este coninut n parametrul wParam al mesajelor WM_KEYUP,
WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN. Cel mai des utiizate
coduri virtuale sunt definite n fiierele antet din windows, avnd un nume
sepcific precedat de prefixul VK- virtual key. De exemplu: VK_SHIFT,
VK_CONTROL i VK_RETURN sunt codurile virtuale corespunztoare tastelor
Shift, Ctrl i Enter ale tastaturii.
Starea tastelor de modificare (Shift, Alt, Ctrl) poate fi obinut cu
ajutorul funciei GetKeyState. De exemplu:
GetKeyState (VK_SHIFT)
returneaz o valoare negativ (adic un numr n care primul bit are valoarea
1) dac tasta Shift este apsat. Valoarea returnat de apelul: GetKeyState
(VK_CAPITAL) are un 1 n bitul cel mai puin semnificativ dac tasta Caps Lock
este activ. Funcia GetKeyState nu verific starea tastaturii n timp real, ci
starea tastaturii pn n momentul mesajului curent. Pentru a obine starea
curent a unei taste, se folosete funcia GetAsyncKeyState.
Utilizarea mesajelor de acionare a tastelor:
n principiu, este necesar ca n scrierea unui program windows s se in
cont numai de mesajele WM_KEYDOWN i WM_KEYUP, ntruct mesajele
WM_SYSKEYUP, WM_SYSKEYDOWN sunt folosite pentru funcii de sistem (deci
nu este necesar interceptarea lor). Mai mult, dac sunt prelucrate mesajele
WM_KEYDOWN, pot fi ignorate mesajele WM_KEYUP.
Programele pentru Windows folosesc mesajele WM_KEYDOWN pentru
tastele care nu genereaz caractere. Folosirea mesajelor pentru acionri de
taste n combinaie cu informaiile despre tastele de modificare (furnizate de
funcia GetKeyState) cu scopul de a le transforma n mesaje pentru caractere,
poate genera probleme din cauza diferenelor ntre tastaturile internaionale.
Mesajele WM_KEYDOWN sunt utile pentru tastele de deplasare, tastele
funcionale i tastele speciale, precum Insert, Delete. Uneori tastele Insert,
Delete si tastele funcionale sunt folosite ca acceleratori pentru comenzi de
meniu. Deoarece Windows transform acceleratorii n comenzi de meniu, nu
este nevoie s prelucrai n program mesajele pentru acionarea tastelor de

accelerare. De cele mai multe, mesajele WM_KEYDOWN sunt prelucrate


numai pentru tastele de deplasare a cursorului. Unele funcii Windows
folosesc de multe ori tastele de deplasare n combinaie cu tasta Shift pentru
extinderea unei selecii - de exemplu ntr-un procesor de texte. Tasta Ctrl este
folosit deseori pentru a schimba semnificaia unei taste de deplasare. De
exemplu, tasta Ctrl n combinaie cu sgeata spre dreapta mut cursorul cu un cuvnt la
dreapta.
16.Crearea ferestrelor child.
Fereastra descendent prelucreaz mesajele primite de la mouse i de la
tastatur i ntiineaz fereastra printe atunci cnd starea proprie se
modific. n acest fel, fereastra descendent devine un dispozitiv de
introducere a datelor pentru fereastra printe. Fereastra descendent
ncapsuleaz funcionaliti specifice legate de modul de afiare pe ecran,
rspunde de datele introduse de utilizator i metodele de ntiinare a unei
alte ferestre n momentul producerii unui eveniment important.
Dei pot fi create propriile controale de tip fereastr descendent, este mai
uor de a beneficia de avantajele oferite de un set de clase de fereastr (i
proceduri specifice) predefinite, clase pe care programele pot s le foloseasc
pentru crearea unor controale de tip fereastr descendent standard: butoane,
casete de validare, casetede editare, casete list, casete combinate, bare de
derulare.
Fiecare fereastr descendent este creat printr-un apel al funciei
CreateWindow. Poziia i dimensiunea pot fi modificate
apelnd funcia
MoveWindow . Cnd este folosit unul dintre controalele predefinite, nu este
necesar nregistrarea unei clase pentru fereastra descendent. Clasa exist
deja n Windows i are unul dintre aceste nume: button", static",
scrollbar", edit", listbox" sau combobox". Unul din aceste nume este
utilizat ca parametru al funciei CreateWindow. Parametrul de stil (style) al
funciei CreateWindow definete mai precis aspectul i funcionalitatea
controlului de tip fereastr descendent. Sistemul de operare Windows conine
deja procedurile de fereastr pentru prelucrarea mesajelor ctre fereastra
descendent pe baza acestor clase.
Procedura ferestrei printe trimite mesaje ctre controlul de tip fereastr
descendent, iar acesta trimite mesaje ctre procedura ferestrei printe.
Dup apelarea funciei CreateWindow nu mai trebuie s facem nimic n
legtur cu aceste ferestre descendent. Procedura ferestrei buton din
Windows execut ntreinerea acestor butoane i toate operaiile de
redesenareLa terminarea programului, Windows distruge toate ferestrele
descendent odat cu distrugerea ferestrei printe.
17. Cum poate fi obinut variabila handle a unui device context?
Exist mai multe metode de obinere a variabilei handle de dispozitiv. Prima
metod este legat de tratarea mesajelor WM_PAINT, i anume, prin apelul
funciilor BeginPaint i EndPaint:
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
[apelarea unor funcii GDI]
EndPaint (hwnd, &ps) ;

return 0 ;
Aceste funcii au nevoie de variabila handle a ferestrei (transmis
procedurii de fereastr ca parametru) i de adresa unei variabile de tipul
PAINTSTRUCT. n timpul prelucrrii mesajului WM_PAINT, procedura de
fereastr apeleaz mai nti funcia BeginPaint ca s completeze cmpurile
structurii ps. Valoarea returnat de funcia BeginPaint este variabila handle a
contextului de dispozitiv. n general, aceasta este salvat ntr-o variabil
numit hdc de tipul HDC. Tipul de date HDC este definit ca un ntreg fr
semn, pe 32 de bii. Apelul funciei EndPaint elibereaz variabila handle a
contextului de dispozitiv.
O alt metod de obinere a variabilei handle a contextului de dispozitiv,
utlizat in afara prelucrarii mesajelor WM_PAINT este apelul la funcia GetDC.
Funcia ReleaseDC elibereaz variabila atunci cnd nu mai este necesar:
hdc = GetDC(hwnd) ;
[apelarea unor funcii GDI]
ReleaseDC(hwnd, hdc) ;
La fel ca funciile BeginPaint i EndPaint, i funciile GetDC i ReleaseDC ar
trebui apelate n pereche, n timpul prelucrrii aceluiai mesaj. Diferena
dintre cele dou metode de obinere a variabilei hdc este c variabila handle
returnat de funcia GetDC se refer la un dreptunghi cu ntreaga zon client
a ferestrei, i nu doar la un dreptunghi invalid. Spre deosebire de funcia
BeginPaint, GetDC nu valideaz nici o regiune invalid.
Un program Windows poate s obin i o variabil handle a unui context
de dispozitiv care se aplic ntregii ferestre, nu numai zonei client a ferestrei:
hdc = GetWindowDC (hwnd);
[alte linii de program]
ReleaseDC (hwnd, hdc);
Contextul de dispozitiv include, n afar de zona client, bara de titlu a
ferestrei, barele de derulare i chenarul
Funciile BeginPaint, GetDC i GetWindowDC obin variabila handle a
contextului de dispozitiv asociat unei anumite ferestre de pe ecran. O funcie
mai general pentru obinerea variabilei handle a unui context de dispozitiv
este CreateDC:
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
[alte linii de program]
DeleteDC (hdc);
Pentru a obine o variabila handle a contextului de dispozitiv pentru tot
spaiul de afiare, se utilizeaz urmtorul apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
18. Curbe Bezier. Funcia PolyBezierTo.
Curbele Bezier i datoreaz numele inginerului Pierre Bezier, angajat al
companiei de automobile Renault, care a elaborat un set de formule necesare
proiectrii la calculator a caroseriilor. De atunci, datorit formei
bidimensionale, curba Bezier s-a dovedit a fi cea mai util curb pentru
grafica pe calculator.
O curb Bezier este definit prin patru puncte - dou capete i dou puncte
de control. Capetele curbei sunt ancorate n cele dou puncte finale. Punctele

de control acioneaz ca nite magnei" care deformeaz linia dreapt dintre


cele dou puncte finale.
Funciile Bezier sunt considerate utile pentru proiectarea asistat de
calculator, datorit ctorva caracteristici:
n primul rnd, cu puin practic, de obicei putei s manipulai curba
pn ajunge la o form apropiat de cea dorit.
n al doilea rnd, curbele Bezier sunt foarte uor de controlat. n unele
variante ale funciilor spline, curba nu trece prin nici unul din punctele care o
definesc. Curbele Bezier, ns, sunt ntotdeauna ancorate n cele dou puncte
finale. (Aceasta este una dintre ipotezele de la care pornete calculul formulei
Bezier.) De asemenea, unele forme ale funciilor spline au puncte de
singularitate, din care curba se ntinde la infinit. n proiectarea asistat de
calculator acest lucru este de cele mai multe ori evitat. Ca urmare, curbele
Bezier sunt ntotdeauna limitate de un patrulater (numit carcas convex" convex hull") format prin unirea punctelor finale i a punctelor de control.
n al treilea rnd, o alt caracteristic a curbelor Bezier implic relaiile
dintre punctele finale i punctele de control. Curba este ntotdeauna tangent
la linia trasat de la primul punct final la primul punct de control i are
ntotdeauna aceeai direcie cu aceast linie. (Aceast caracteristic este
ilustrat vizual de programul BEZIER.) De asemenea, curba este ntotdeauna
tangent la linia trasat de la al doilea punct final la al doilea punct de control
i are ntotdeauna aceeai direcie cu aceast linie. (Acestea sunt alte dou
ipoteze de la care este derivat formula Bezier.)
n al patrulea rnd, curbele Bezier sunt satisfctoare i din punct de vedere
estetic.
Pentru trasarea mai multor curbe Bezier conexe, se ulizeaz instruciunea:
PolyBezierTo (hdc,pt, iCount) ,
unde pt este o matrice de structuri POINT. Parametrul iCount reprezint
numrul de puncte din matrice, adic unu plus de trei ori numrul curbelor pe
care vrei s le desenai.
Funcia PolyBezierTo folosete poziia curent ca punct de nceput pentru
prima curb Bezier. Fiecare curb desenat are nevoie doar de trei puncte. La
returnarea funciei, poziia curent este punctul final al ultimei curbe
desenate.
19. Cursorul de editare (CARET). Funcii pentru cursorul de editare. Soluia Unicode pentru
Windows.
Atunci cnd se introduce text ntr-un program, poziia n care va aprea
urmtorul caracter este indicat de o liniu de subliniere sau de un mic
dreptunghi, n Windows pentru acest semn se folosete termenul cursor de
editare".
Funcii pentru cursorul de editare
Exist cinci funcii principale pentru cursorul de editare:
CreateCaret - creeaz un cursor de editare asociat unei ferestre.
SetCaretPos - stabilete poziia cursorului de editare n fereastr.
ShowCaret - afieaz cursorul de editare.
HideCaret - mascheaz cursorul de editare.

DestroyCaret - distruge cursorul de editare creat.


Mai exist i alte funcii pentru obinerea poziiei cursorului de editare
(GetCaretPos) i pentru stabilirea i obinerea intervalelor de licrire a
acestuia (SetCaretBlinkTime i GetCaretBlinkTime).
Cursorul de editare este, de obicei, o linie ori un bloc orizontal de
dimensiunea unui caracter, sau o linie vertical. Linia vertical este
recomandat n cazul folosirii unui font proportional, cum ar fi fontul sistem
prestabilit din Windows. Deoarece caracterele din fonturile proporionale nu
au aceeai lime, linia sau blocul orizontal nu poate avea limea exact a
unui caracter.
Cursorul de editare nu poate fi creat pur i simplu n timpul prelucrrii
mesajului WM_CREATE i nici distrus n timpul prelucrrii mesajului
WM_DESTROY. El este ceea ce se numete o resurs de sistem". Aceasta
nseamn c n sistem exist un singur cursor de editare. De fapt, atunci cnd
un program trebuie s afieze un cursor de editare n fereastra proprie, el
mprumut" acest semn de la sistem.
Cursorul de editare este afiat n fereastra care deine cursorul de intrare
(input focus). La un moment dat, o singur fereastr poate deine cursorul de
intrare, aa c existena unui singur cursor de editare este logic.
Un program poate determina dac deine cursorul de intrare prin
prelucrarea mesajelor WM_SETFOCUS i WM_KILLFOCUS. O procedur de
fereastr recepioneaz un mesaj WM_SETFOCUS atunci cnd primete
cursorul de intrare i un mesaj WM_KILLFOCUS atunci cnd pierde cursorul de
intrare. Aceste mesaje sunt transmise n pereche. O procedur de fereastr
primete ntotdeauna un mesaj WM_SETFOCUS nainte de a primi un mesaj
WM_KILLFOCUS i ntotdeauna va primi un numr egal de mesaje
WM_SETFOCUS i WM_KILLFOCUS pan la distrugerea ferestrei.
Principala regul de folosire a cursorului de editare este simpl. O
procedur de fereastr apeleaz funcia CreateCaret n timpul prelucrrii
mesajului WM_SETFOCUS i funcia DestroyCaret n timpul prelucrrii
mesajului WM_KILLFOCUS.
Exist i alte cteva reguli: la creare, cursorul de editare nu este afiat.
Dup apelarea funciei CreateCaret, programul trebuie s apeleze funcia
ShowCaret pentru a face vizibil cursorul de editare. n plus, procedura de
fereastr trebuie s-l mascheze, apelnd funcia HideCaret, ori de cte ori
deseneaz ceva pe ecran n timpul prelucrrii unui alt mesaj dect WM_PAINT.
Dup terminarea operaiei de desenare, programul apeleaz funcia
ShowCaret ca s afieze din nou cursorul de editare. Efectul funciei
HideCaret este aditiv: dac s+a apelat funcia HideCaret de mai multe ori fr
a fi apelat funcia ShowCaret, atunci cnd se dorete ca acest cursor de
editare s devin din nou vizibil,este necesar apelul funciei ShowCaret de tot
attea ori de cate ori s-a apelat i funcia HideCaret.
20. Desenarea suprafeelor pline. Funcia Polygon i modul de umplere a
poligoanelor. Funcia SetPolyFillMode. Umplerea suprafeelor interioare.
Pentru desenarea suprafee pline sunt utilizate 7 funcii windows:
Funcie
Figura

Rectangle
Ellipse
RoundRect
Chord

Dreptunghi cu coluri drepte


Elips
Dreptunghi cu coluri rotunjite
Arc pe circumferina unei elipse, avnd
capetele unite printr-o coard
Pie
Suprafa de forma unei felii de plcint,
reprezentnd un segment de elips.
Polygon
PolyPolygon Figur geometric avnd mai multe laturi Mai
multe figuri geometrice cu mai multe laturi
Windows deseneaz conturul figurilor folosind penia curent selectat n
contextul de dispozitiv i umple interiorul lor cu pensula curent. n mod
prestabilit, aceasta este pensula de stoc WHITE_BRUSH, ceea ce nseamn c
interiorul figurilor va fi umplut cu alb. Windows definete ase pensule de
stoc:
WHITE_BRUSH,
LTGRAY_BRUSH,
GRAY_BRUSH,
DKGRAY_BRUSH,
BLACK_BRUSH i NULL_BRUSH (sau HOLLOW_BRUSH).
Windows definete tipul HBRUSH ca variabil handle a unei pensule.
Pentru a obine variabila handle a unei pensulei de stoc se apeleaz funcia
GetStockObject:.
hBrush = GetStoCkObject (GRAY_BRUSH) ;
Odat selectat in contextual de dispozitiv cu ajutorul funciei SelectObject
(hdc, hBrush)
pensula respectiv va colora interiorul figurilor n gri. Pentru a desena o figur
fr contur se utilizeaz penia NULL_PEN, i , n mod similar, pentru a desena
o figur fr contur se utlizeaz pensula NULL_BRUSH.
Funcia Polygon este utlizat pentru a desena diverse poligoane pe baza
unui sistem de puncte. Ea are drept parametric variabila handle a contextului
de dispozitiv, un pointer la o matrice de structure POINT, i numrul de puncte
din matrice: Polygon (hdc, pt, iCount) .
Suprafaa nchis de poligon este colorat folosind pensula curent n dou
moduri: ALTERNATE sau WINDING . Modul prestabilit de umplere a
poligoanelor este ALTERNATE, ceea ce nseamn c Windows coloreaz numai
suprafeele nchise la care se poate ajunge din exteriorul poligonului prin
traversarea unui numr impar de laturi (1, 3, 5 i aa mai departe). Celelalte
suprafee interioare nu sunt umplute.
Modul WINDING de umplere, presupune colorarea tuturor suprafeelor
nchise de polygon. Modul de umplere poate fi setat cu ajutorul funciei
SetPolyFillMode:
SetPolyFillMode (hdc, iMode) .
Umplerea suprafeelor interioare
Interiorul figurilor Rectangle, RoundRect, Ellipse, Chord, Pie, Polygon i
PollyPolygon este umplut cu pensula - numit uneori i model" (pattern") selectat n contextul de dispozitiv. O pensul este de fapt o imagine bitmap
8x8 repetat pe vertical i pe orizontal, pentru umplerea unei suprafee.
Windows conine patru funcii pentru crearea pensulelor logice:

hBrush = CreateSolidBrush (rgbColor) ;

hBrush = CreateHatchBrush (iHatchStyle, rgbColor) crearea unei pensule


haurat" cu linii orizontale, verticale sau oblice. Parametrul iHatchStyle
precizeaz aspectul haurii i poate avea una dintre urmtoarele valori:
HS_HORIZONTAL,
HS_VERTICAL,
HS_FDIAGONAL,
HS_BDIAGONAL,
HS_CROSS i HS_DIAGCROSS.

hBrush = CreatePatternBrush (hBitmap) crearea unei pensule proprii, bazat


pe o imagine bitmap.

hBrush = CreateBrushIndirect (&logbrush) - funcie care poate nlocui


toate celelalte trei funcii de creare a pensulelor. Variabila logbrush este o
structur de tip LOGBRUSH (logical brush") cu 3 cmpuri: lbStyle (UINT),lbColor
(COLORREF),lbHatch (LONG).

Pentru a selecta pensula n contextul de dispozitiv se folosete funcia SelectObject:


SelectObject (hdc, hBrush) ;

O pensul creat poate fi tears cu ajutorul funciei DeleteObject:


DeleteObject (hBrush) ;

Pentru a obine informaii despre o pensul, se apeleaz funcia GetObject:


GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush) ;

unde variabila logbrush este o structur de tip LOGBRUSH (logical brush").


Dimensiunea unui caracter. Funcia GetTextMetrics. Tipul TEXTMETRIC.
Dimensiunile textului.
Dimensiunea unui caracter este necesar n cazul utilizrii funciei
TextOut pentru afiarea mai multor linii. Spaiul dintre liniile succesive de text
poate fi stabilit pe baza nlimii unui caracter iar spaiul dintre coloane pe
baza limii medii a caracterelor din font.
Dimensiunile
caracterelor
sunt
obinute
prin
apelarea
funciei
GetTextMetrics. Funcia GetTextMetrics are ca parametru o variabil handle
a contextului de dispozitiv, deoarece returneaz informaii despre fontul
selectat n contextul de dispozitiv. Windows copiaz valorile referitoare la
dimensiunile caracterelor ntr-o structur de tip TEXTMETRIC. Valorile sunt
exprimate n uniti de msur care depind de modul de mapare selectat n
contextul de dispozitiv. n contextul prestabilit de dispozitiv, modul de mapare
este MM_TEXT, aa c dimensiunile sunt date n pixeli.
Pentru folosirea funciei GetTextMetrics se definete mai nti o variabil de tipul
TEXTMETRIC (numit, de obicei, tm):
TEXTMETRIC tm;
n continuare se obine o variabil handle a contextului de dispozitiv i se apeleaz funcia
GetTextMetrics:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm) ;
ReleaseDC(hwnd, hdc);
Astfel se obine o structura cu infomii despre dimensiunile textului, care pot fi salvate pentru
utilizarea n viitor.
Dimensiunile textului:
21.

tmInternalLeading - spaiul pstrat deasupra unui caracter pentru semnele de accentuare.


tmExternalLeading - spaiul recomandat pentru a fi lsat ntre rndurile de text.
tmAveCharWidth -limea medie a literelor mici.
tmMaxCharWidth -limea celui mai mare caracter al fontului.
Limea medie a majusculelor poate fi obinut calculnd 150% din valoarea tmAveCharWidth.
22. DIMENSIUNEA ZONEI CLIENT. Macroinstruciunile LOWORD i HIWORD (LOWORD
(lParam), HIWORD (lParam)). Barele de derulare. Domeniul i poziia unei bare de
derulare.
Dimensiunea ferestrelor poate s varieze foarte mult: de la o valoare maxim n care zona client
ocup ntregul ecran, cu excepia barei de titlu a programului pn la o valoare minim n care
zona client este de fapt eliminat. Dimensiunile totale ale ferestrei mrite pot fi obinute prin
apelarea
funciei
GetSystemMetrics
cu
parametrii
SM_CXFULLSCREEN
i
SM_CYFULLSCREEN. Pentru un monitor VGA valorile returnate sunt 640 i 461 de pixeli.
O metod obinuit de determinare a dimensiunilor zonei client a unei ferestre este prelucrarea
mesajului WM_SIZE n procedura de fereastr. Windows trimite un mesaj WM_SIZE ctre
procedura de fereastr, de fiecare dat cnd se modific dimensiunile ferestrei. Parametrul lParam
transmis procedurii de fereastr conine limea zonei client n cuvntul mai puin semnificativ
(LOWORD) i nlimea zonei client n cuvntul mai semnificativ (HIWORD). Codul pentru
prelucrarea acestui mesaj arat astfel:
static int cxClient, cyClient ;
[alte linii de program] case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
Despachetarea parametrului lParam pentru obinerea dimensiunilor zonei client se face cu
ajutorul macroinstruciunilor LOWORD i HIWORD, care sunt definite n fiierele antet din
Windows.
Barele de derulare se numr printre cele mai reuite componente ale
unei interfee grafice pentru mouse avnd funcia de a permite vizualizarea
informaiei pentru care este nevoie de mai mult spaiu dect este disponibil n
zona client a ferestrei.
Ele sunt poziionate vertical (pentru deplasri n sus i n jos) sau orizontal
(pentru deplasri la stnga i la dreapta). Bara de derulare este parcurs
longitudinal de o caset de derulare" care indic poziia aproximativ a prii
afiate pe ecran fa de ntregul document.
Pentru a include n fereastra aplicaiei o bar de derulare orizontal sau
vertical este necesar de a include identificatorul WS_VSCROLL (derulare
vertical) i/sau WS_HSCROLL (derulare orizontal) n stilul de fereastr din
apelul funciei CreateWindow. Barele de derulare sunt plasate ntotdeauna la
marginea de jos sau la cea din dreapta a ferestrei i se ntind pe toat

limea, respectiv nlimea zonei client. Zona client nu include spaiul ocupat
de barele de derulare. Limea unei bare de derulare verticale i nlimea
uneia orizontale sunt constante pentru un driver de afiare dat..
Windows se ocup de modul de utilizare a mouse-ului pentru barele de
derulare, dar barele de derulare ale ferestrelor nu au o interfa automatizat
cu tastatura.
Domeniul i poziia unei bare de derulare
Fiecare bar de derulare are asociate un domeniu" (definit printr-o
pereche de numere ntregi care reprezint valorile maxim i minim) i o
poziie" (punctul n care se afl caseta de derulare n domeniul asociat barei
de derulare). Atunci cnd caseta de derulare se afl la captul de sus (sau la
captul din partea stng) al barei de derulare, poziia corespunde valorii
minime. Captul de jos (sau captul din partea dreapt) al barei de derulare
reprezint valoarea maxim.
n mod prestabilit, domeniul unei bare de derulare este de la 0 (sus sau n
stnga) la 100 (jos sau n dreapta) dar poate fi uor modificat astfel nct s
aib o form mai convenabil pentru program:
SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ;
Parametrul iBar poate avea una dintre valorile SB_VERT i SB_HORZ, iar
iMin i iMax sunt poziiile minim i maxim din domeniu, n timp ce bRedraw
trebuie s aib valoarea TRUE pentru ca Windows s redeseneze bara de
derulare pe baza noului domeniu stabilit.
Poziia casetei de derulare este reprezentat ntotdeauna printr-o valoare
ntreag. De exemplu, o bar de derulare cu domeniul cuprins ntre 0 i 4 are
cinci poziii ale casetei de derulare.
Pentru a stabili o nou poziie a casetei de derulare pe bara de derulare se
utilizeaz funcia SetScrollPos :
SetScrollPos (hwnd, iBar, iPos, bRedraw) ;
Parametrul iPos reprezint noua poziie, care trebuie s fie cuprins n
domeniul delimitat de iMin i iMax. Windows conine funcii asemntoare
(GetScrollRange i GefScrollPos) pentru obinerea domeniului i a poziiei unei
bare de derulare.
23. Elemente de baz despre mouse. Funcia GetSystemMetrics
(SM_MOUSEPRESENT); cButtons = GetSystemMetrics
(SM_CMOUSEBUTTONS). Parametrul SM_SWAPBUTTON. Zona senzitiv a
indicatorului.
Windows 95 permite folosirea mouse-ului cu un buton, cu dou butoane sau
cu trei butoane, precum i folosirea unui joystick sau a unui creion optic,
pentru simularea unui mouse cu un buton. Totui, cel mai utlizat este mouseul cu trei butoane, devenit un standard de facto. Al doilea buton al mouse-ului
este recomandat pentru apelarea meniurilor de context" - meniuri care apar
n fereastr n afara barei de meniu - sau pentru operaii speciale de tragere.
Pentru a determina dac mouse-ul este prezent se folosete funcia
GetSystemMetrics avnd drept parametru identificatorul SM_MOUSEPRESENT:
fMouse = GetSystemMetrics (SM_MOUSEPRESENT) ;
Variabila fMouse va avea valoarea TRUE (diferit de zero) dac mouse-ul
este instalat. Pentru determinarea numrului de butoane ale mouse-ului
instalat, folosii tot funcia GetSystemMetrics:
cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS) ;

Aceast funcie returneaz valoarea 0 dac mouse-ul nu este instalat.


Utilizatorii care folosesc mna stng pot s inverseze butoanele mouseului folosind Panoul de control din Windows. O aplicaie poate s determine
dac
butoanele
mouse-ului
au
fost
inversate
apelnd
funcia
GetSystemMetrics cu parametrul SM_SWAPBUTTON.
Zona senzitiv a indicatorului. Atunci cnd utilizatorul deplaseaz
mouse-ul, Windows deplaseaz pe ecran o mic imagine bitmap numit
indicator". Indicatorul are o zon senzitiv" cu dimensiunea de un pixel, care
indic o poziie precis pe ecran.
Driverul de afiare conine cteva indicatoare de mouse predefinite, care
pot fi folosite de programe. Indicatorul cel mai obinuit este sgeata oblic
definit n fiierele antet din Windows cu numele IDC_ARROW. Zona senzitiv
a acestui indicator este vrful sgeii. Indicatorul IDC_CROSS are zona
senzitiv situat la celor dou linii.
24. Ferestre child de control i culoare.

Ades, utilizarea unor aspecte implicite pentru crearea butoanelor duce la un


design neclar sau mai putin atragtor- Pentru a mbunti aspectul acestor
butoane trebuie ori s schimbm culoarea zonei client, aa nct aceasta s se
asorteze cu fondul butoanelor, ori s schimbm culoarea folosit pentru fondul
butoanelor.

Culorile de sistem pentru butoane:

COLOR_BTNFACE este folosit pentru culoarea suprafeei principale a butoanelor de


apsare i pentru fondul celorlalte butoane. (De asemenea, aceasta este culoarea de
sistem folosit pentru casete de dialog i casete de mesaje.)
COLOR_BTNSHADOW este folosit pentru sugerarea unei umbre la marginile din
dreapta i de jos ale butoanelor de apsare, precum i n interiorul ptratelor din
casetele de validare i a cercurilor din butoanele radio.
COLOR_BTNTEXT- culoarea textului n cazul butoanelor de apsare
COLOR_WINDOWTEXT - culoarea textului pentru pentru celelalte butoane.
n cazul afirii butoanelor pe suprafaa zonei client, una dintre metodele de evitare
a conflictelor ntre culori este folosirea culorilor de sistem. Pentru nceput, se folosete
COLOR_BTNFACE la definirea clasei de fereastr pentru fondul zonei client:
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;

Atunci cnd variabila hbrBackground din structura WNDCLASSEX are o valoare,


Windows nelege c aceasta se refer la culoarea de sistem, nu la o variabil
handle. Atunci cnd sunt
specificate n cmpul hbrBackground al structurii
WNDCLASSEX, la aceste valori trebuie adugat 1, pentru a se evita folosirea valorii
NULL. Dac n timpul rulrii programului culoarea de sistem se schimb, suprafaa
zonei client va fi invalidat i Windows va folosi noua valoare pentru COLOR_BTNFACE.
Pentru a rezolva problema cauzat de necorespondena dintre culoarea de sistem i
fondul din spatele textului n cazul funciei TextOut se vor utiliza funciile SetTextColor
i SetBkColor. Astfel, culorile pentru fond i pentru text vor fi identice culorile de
sistem.
SetBkColor (hdc, GetSysColor (COLORBTNFACE)) ; SetTextColor (hdc, GetSysColor
(COLOR_WINDOWTEXT)) ;

Acum, fondul zonei client, al textului i culoarea textului se potrivesc cu culorile


butoanelor.

Mesajul WM_CTLCOLORBTN

Modificarea culorilor butoanelor nu este o idee plauzibil din punct de


vedere practic. Apelul funciei SetSysColors cu scopul modificrii aspectului
butoanelor, va afecta toate programele care ruleaz n momentul respectiv sub
Windows - o micare pe care utilizatorii nu o vor aprecia prea mult.
O abordare mai potrivit (teoretic) este prelucrarea mesajului
WM_CTLCOLORBTN. Acesta este un mesaj pe care controalele de tip buton l
trimit ctre procedura ferestrei printe atunci cnd fereastra descendent este
pe cale de a executa o redesenare. Fereastra printe poate s foloseasc
aceast ocazie ca s modifice culorile pe care procedura ferestrei descendent
urmeaz s le foloseasc pentru desenare.
Atunci cnd procedura printe recepioneaz mesajul WM_CTLCOLORBTN,
parametrul wParam conine variabila handle a contextului de dispozitiv al
butonului, iar IParam este variabila handle a ferestrei butonului. Atunci cnd
fereastra printe primete acest mesaj, controlul de tip buton a obinut deja
contextul de dispozitiv. n timpul prelucrrii mesajului WM_CTLCOLORBTN:
Se stabilete (opional) o culoare de text cu ajutorul funciei SetTextColor.
Se stabilete (opional) o culoare de fond cu ajutorul funciei SetBkColor.
Se returneaz ctre fereastra descendent o variabil de manipulare a
pensulei
cu care se va desena.
Teoretic, fereastra descendent folosete pensula respectiv pentru colorarea
fondului
Totui, n legtur cu mesajul WM_CTLCOLORBTN este o problem: acesta nu
este trimis dect de butoanele de apsare i de butoanele desenate de
proprietar; de asemenea, numai butoanele desenate de proprietar rspund la
prelucrarea fcut mesajului de ctre fereastra printe, folosind pensula
trimis pentru colorarea fondului. Oricum, acest lucru este inutil, deoarece
fereastra printe este rspunztoare de desenarea acestor butoane.
25. Ferestre child. Butoane definite de programator.
S_OWNERDRAW
Crearea unui buton cu stilul BS_OWNERDRAW ofer controlul complet asupra
aspectului vizual al butonului. Majoritatea programelor care folosesc stilul
BS_OWNERDRAW pentru desenarea butoanelor de proprietar folosesc mici
imagini (bitmap) pentru identificarea acestor butoane.
Un buton creat cu stilul BS_OWNERDRAW trimite ferestrei printe un mesaj
WM_DRAWITEM de fiecare dat cnd butonul trebuie s fie redesenat. Aceasta
se ntmpl la crearea butonului, de fiecare dat cnd este apsat sau
eliberat, cnd obine sau pierde cursorul de intrare i n orice alt situaie cnd
trebuie s fie redesenat.
n mesajul WM_DRAWITEM, parametrul IParam este un pointer ctre o
structur de tip DRAWITEMSTRUCT. Aceast structur conine informaiile
necesare programului pentru redesenarea butonului. Cmpurile din structur
importante pentru lucrul cu butoane sunt hDC (contextul de dispozitiv al
butonului), rcltem (o structur RECT n care este stocat dimensiunea
butonului), CtllD (identificatorul ferestrei controlului) i UemState (care indic
dac butonul este apsat sau dac deine cursorul de intrare).

Dac butonul este apsat, unul dintre biii cmpului UemState din structura
DRAWITEMSTRUCT are valoarea 1. Acest bit poate fi testat folosind constanta
ODS_SELECTED. Dac butonul deine cursorul de intrare, atunci bitul
ODS_FOCUS din cmpul UemState are valoarea 1.
n cazul folosirii buroanelor desneate de proprietar, Windows obine contextul de
dispozitiv i l include n structura DRAWITEMSTRUCT. Este necesar ca la sfrit
contextul de dispozitiv s fie n aceeai stare ca la nceput, deci orice obiect GDI selectat n
contextul de dispozitiv trebuie s fie deselectat.
26. Ferestre child. Butoane i input focus.
Butoanele de apsare, butoanele radio i butoanele desenate de proprietar
primesc cursorul de intrare atunci cnd se execut clic pe acestea. Controlul
indic faptul c deine cursorul de intrare printr-o linie punctat care
nconjoar textul. Atunci cnd o fereastr descendent primete cursorul de
intrare, fereastra printe l pierde; toate intrrile de la tastatur sunt
direcionate ctre control, nu ctre fereastra printe. Totui, controalele de tip
fereastr descendent rspund numai la apsarea barei de spaiu, care
funcioneaz n acest caz ca i butonul mouse-ului. Cu alte cuvinte,
programul a pierdut controlul asupra tastaturii.
Atunci cnd sistemul de operare Windows mut cursorul de intrare de la o
fereastr (cum ar fi fereastra printe) la o alt fereastr (cum ar fi controlul de
tip fereastr descendent), trimite mai nti un mesaj WM_KILLFOCUS ctre
fereastra care pierde cursorul de intrare. Parametrul wParam al mesajului
este variabila handle a ferestrei care primete cursorul de intrare. Windows
trimite apoi un mesaj WM_SETFOCUS ctre fereastra care primete cursorul
de intrare. Parametrul wParam al mesajului este variabila de manipulare a
ferestrei care pierde cursorul de intrare. (n ambele cazuri, wParam poate avea
valoarea NULL, ceea ce arat c nici o fereastr nu primete sau nu pierde
cursorul de intrare.)
O fereastr printe poate mpiedica un control de tip fereastr
descendent s primeasc cursorul de intrare prelucrnd mesajul
WM_KILLFOCUS. S presupunem c matricea hwndCmd conine variabilele
handle ale tuturor ferestrelor descendent. (Aceste variabile au fost salvate n
matrice n timpul apelrii funciei CreateWindow pentru crearea ferestrelor
descendent.) NUM este numrul ferestrelor descendent.
case WM_KILLFOCUS :
for (i = 0 ; i < NUM ; 1++)
if (hwndChild[i] == (HWND) wParam
SetFocus (hwnd) ;
break ;
return 0 ;
n aceast secven de cod, atunci cnd fereastra printe este avertizat c
urmeaz s piard cursorul de intrare n favoarea uneia dintre ferestrele
descendent, apeleaz funcia SetFocus ca s rectige cursorul de intrare.
ns aceast prelucrare mpiedic butoanele s rspund la apsarea barei
de spaiu, deoarece butoanele nu obin niciodat cursorul de intrare. O soluie
mai bun ar fi permiterea butoanelor s obin cursorul de intrare, i, n

acelai timp, permiterea utilizatorului s treac de la un buton la altul cu


ajutorul tastei Tab.
27. Ferestre child. Butoane visibile i accesibile.
Pentru recepionarea intrrilor de la mouse i de la tastatur, o fereastr
descendent trebuie s fie vizibil (afiat), dar i activat. Atunci cnd o
fereastr este vizibil, dar nu este activat, textul acesteia este afiat cu gri,
n loc de negru.
Dac parametrul WS_VISIBLE nu este inclus n clasa ferestrei la crearea
ferestrei descendent, aceasta nu va fi afiat pn cnd nu este apelat
funcia ShowWindow:
ShowWindow (hwndChild, SW_SHOWNORMAL) ;
Dac parametrul WS_VISIBLE este inclus n clasa ferestrei, nu este necesar
apelul funcia ShowWindow. Totui, prin apelarea funciei ShowWindow poate
fi mascat o fereastr descendent afiat:
ShowWindow (hwndChild, SW_HIDE) ;
Pentru a determina dac o fereastr descendent este afiat se utilizaz
apelul:
IsWindowVisible (hwndChild) ;
n mod prestabilit, ferestrele descendent sunt activate. Pentru a le
dezactiva se utilizeaz funcia:
EnableWindow (hwndChild, FALSE) ;
Pentru controalele de tip buton, aceast aciune are ca efect afiarea cu gri a
textului din buton. Butonul nu mai rspunde la intrrile de la mouse sau
de la tastatur. Aceasta este cea mai bun metod de a indica faptul c
opiunea reprezentat de un anumit buton nu este disponibil.
Pentru a reactiva o fereastr descendent se utilizeaz aceeai funcie,
dar avnd drept al doliea parametru valoarea TRUE:
EnableWindow (hwndChild, TRUE) ;
Pentru a determina dac o fereastr descendent este activ sau nu se
utilizeaz funcia:
IsWindowEnabled (hwndChild) ;
28. Ferestre child. Check box.
Casetele de validare sunt dreptunghiuri etichetate cu un text; de obicei,
textul apare n partea dreapt a casetei de validare. (Dac la crearea
butonului este folosit stilul BS_LEFTTEXT, textul apare n stnga casetei de
validare.) De obicei, casetele de validare sunt incluse n aplicaii pentru a
permite utilizatorilor s selecteze diferite opiuni. Casetele de validare
funcioneaz ca un comutator: executarea unui clic ntr-o caset de validare
determin apariia unui marcaj de validare; un al doilea clic face ca
marcajul de validare s dispar.
Cele mai cunoscute stiluri de casete de validare sunt BS_CHECKBOX i
BS_AUTOCHECKBOX. n cazul stilului BS_CHECKBOX, sarcina de aplicare a
marcajului de validare revine programatorului, prin trimiterea unui mesaj
BS_SETCHECK. Parametrul wParam trebuie s aib valoarea 1 pentru afiarea

marcajului de validare i valoarea 0 pentru tergerea acestuia. Pentru


inversarea marcajului de validare la prelucrarea mesajului WM_COMMAND
primit de la control poate fi utilizat instruciunea:
SendMessage ((HWND) lParam, BM_SETCHECK, (WPARAM)
SendMessage ((HWND) lParam, BM_GETCHECK, 0, 0), 0) ;
Valoarea lParam este variabila handle a ferestrei descendent, transmis ctre
procedura ferestrei prin mesajul WM_COMMAND.
Pentru a iniializa o caset de validare de tip BS_CHECKBOX cu un X, se
utilizeaz aceeai funcie cu parametrul BM_SETCHECK:
SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;
n cazul folosirii stilului BS_AUTOCHECKBOX, controlul este cel care actualizeaz afiarea marcajului de validare. Procedura ferestrei printe poate s
ignore mesajele WM_COMMAND. Pentru a dtermina starea butonului, se
transmite ctre acesta mesajul BM_GETCHECK:
iCheck = (int) SendMessage (hwndButton, BM_GETCHECK, 0, 0) ;
iCheck are valoarea TRUE (sau o valoare diferit de 0) dac butonul este
validat i valoarea FALSE (sau 0) n caz contrar.
Celelalte dou stiluri de casete de validare sunt BS_3STATE i BS_AUTO3STATE.
Aa cum indic i numele lor, aceste stiluri permit afiarea unei stri tere culoarea gri din caseta de validare - n cazul n care se trimite ctre
control un mesaj WM_SETCHECK cu parametrul wParam egal cu 2. Culoarea
gri indic utilizatorului c opiunea respectiv este nedeterminat sau
irelevant. n acest caz, caseta nu poate fi validat - cu alte cuvinte, este
dezactivat. Totui, caseta de validare continu s trimit mesaje ctre
fereastra printe atunci cnd se execut clic.
Caseta de validare este aliniat la partea stng a dreptunghiului i este
centrat ntre marginile de sus i de jos ale acestuia, conform dimensiunilor
specificate la apelarea funciei CreateWindow. Executarea unui clic oriunde
n cadrul dreptunghiului determin trimiterea unui mesaj WM_COMMAND
ctre fereastra printe, nlimea minim a casetei de validare este egal cu
nlimea unui caracter. Limea minim este egal cu numrul de caractere
din text, plus dou.
84.C#: Expresii i operatori. Instruciunile try-catch-finally i throw.
Un operator este un simbol care indica o actiune. Operandul este valoarea
asupra careia se executa operatia. Operatorii alaturi de operanzi formeaza o
expresie.
Clasificarea operatorilor
Operatorii sunt impartiti 3 categorii.
Operatori unari actioneaza asupra unui singur operand.
Operatori binari actioneaza intre doi operanzi.
Operatori ternari actioneaza asupra a trei operanzi. Exista doar unul de acest
tip, operatorul conditional.
Operatorii aritmetici
In C#, exista urmatorii operatori aritmetici : + , - ,* , / , % , ++ , -- .

Operatorii relationali

Operatorii relationali se refera la relatiile de ordine care pot exista intre


doua valori: =, !=, < , > , <= , >= . Deoarece acesti operatori produc
rezultate de tip adevarat sau fals, sunt folositi des cu operatorii logici.
Operatorii logici
Pentru operatorii logici, operanzii trebuie sa fie de tipul bool, rezultatul fiind
tot de acest tip.
Operator

Semnificatie

negatie logica

&&

SI logic

||

SAU logic

Operatorul de atribuire
Operatorul de atribuire = se foloseste intr-o constructie de
forma variabila = expresie. Dupa evaluarea expresiei, rezultatul va fi atribuit
variabilei. Pentru atribuire se mai folosesc si operatorii +=, =, *=, /=, %=.
Operatorul conditional
Este de forma : expresie1? expresie2: expresie3 .
Daca expresie1 este adevarata, atunci va fi returnata valoarea
lui expresie2. Dacaexpresie1 este falsa, atunci va fi returnata valoarea
lui expresie3.

Cuvintele cheie in C# rezervate pentru tratarea exceptiilor


sunt try, catch, finally, throw. Acestea reprezinta un sistem unitar,
utilizarea unuia dintre ele implicand si utilizarea altuia.
Intr-un bloc try vom scrie instructiunile care trebuie verificate pentru aparitia
erorilor. Daca pe parcursul executiei acestor intructiuni apare o exceptie,
aceasta este aruncata, lansata (thrown).
Cu ajutorul lui catch programul poate intercepta exceptia si o poate trata in
functie de logica programului. Instructiunile din catch se executa doar daca se
lanseaza o exceptie.
Instructiunile din finally se vor executa intotdeauna.
O imagine de ansamblu a codului folosit pentru tratarea exceptiilor:
try

{
//in this block exception may get thrown
}
catch
{
//handle exception
}
finally
{
//cleanup code, optionally
}
Cuvantul cheie try nu poate aparea fara a fi completat de cuvantul
cheie catch sau de finally si nici invers. Finally este optional.
Pot exista mai multe instructiuni catch asociate unui try. Instructiunea care se
va executa se va stabili in functie de tipul exceptiei, celelalte sunt ignorate.
Throw
Pentru a lansa manual o exceptie se foloseste throw.
if (numbers == null)
throw new ArgumentNullException("Array is null");
Tipul obiectului trebuie sa fie o clasa derivata din Exception.
85.Evoluia tehnicilor de programare. Tipuri de date obiectuale.
ncapsulare.Suprancrcare.
1.1. Evoluia tehnicilor de programare
Programarea nestructurat(un program simplu, ce utilizeaz numai
variabile globale);complicaiile apar cnd prelucrarea devine mai ampl, iar
datele se multiplic i se diversific.
Programarea procedural(program principal deservit de subprograme cu
parametric formali, variabile locale i apeluri cu parametri efectivi); se obin
avantaje privind depanarea i reutilizarea codului i se aplic noi tehnici
privind transferul parametrilor i vizibilitateavariabilelor; complicaiile apar
atunci cnd la program sunt asignai doi sau mai muliprogramatori care nu
pot lucra simultan pe un acelai fiier ce conine codul surs.
Programarea modular(gruparea subprogramelor cu funcionaliti similare
n module, implementate i depanateseparat); se obin avantaje privind
independena i ncapsularea (prin separarea zonei de implementare,
pstrnd vizibilitatea numai asupra zonei de interfa amodulului) i se aplic
tehnici de asociere a procedurilor cu datele pe care le manevreaz, stabilind i
diferite reguli de acces la date i la subprograme.Se observ c modulele sunt
centrate pe proceduri,acestea gestionnd i setul de date pe care le
prelucreaz.

Programarea orientat obiect(programe cu noi tipuri ce integreaz att


datele, ct i metodele asociate crerii,prelucrrii i distrugerii acestor date);
se obin avantaje prin abstractizarea
programrii (programul nu mai este o succesiune de prelucrri, ci un
ansamblu de obiecte care prind via, au diverse proprieti, sunt capabile de
aciuni specifice i care interacioneaz n cadrul programului); intervin tehnici
noi privind instanierea, derivarea i polimorfismul tipurilor obiectuale.
Tipuri de date obiectuale. ncapsulare
Un tip de date abstract (ADT) este o entitate caracterizat printr-o structur
de date i un ansamblu de operaii aplicabile acestor date. Considernd, n
rezolvarea unei problemede gestiune a accesului utilizatorilor la un anumit
site, tipul abstract USER , vom obseva c sunt multe date ce caracterizeaz
un utilizator Internet. Totui se va ine cont doar de datele semnificative
pentru problema dat. Astfel, culoarea ochilor este irelevant n acest caz,
ntimp ce data naterii poate fi important. n aceeai idee, operaii
specifice ca se nregistreaz, comand on-line pot fi relevante, n timp ce
operaia mannc nu este, n cazul nostru. Evident, nici nu se pun n
discuie date sau operaii nespecifice (numrul delaturi sau aciunea
zboar).Operaiile care sunt accesibile din afara entitii formeaz interfaa
acesteia. Astfel,operaii interne cum ar fi conversia datei de natere la un
numr standard calculat de la01.01.1900 nu fac parte din interfaa tipului de
date abstract, n timp ce operaia plaseaz ocomand on-line face parte,
deoarece permite interaciunea cu alte obiecte (SITE, STOC etc.)
O instan a unui tip de date abstract este o concretizare a tipului
respectiv, formatdin valori efective ale datelor.Un tip de date obiectual este
un tip de date care implementeaz un tip de date abstract.Vom numi
operaiile implementate n cadrul tipului de date abstract metode . Spunem c
datele i metodele sunt membrii unui tip de date obiectual. Folosirea unui
astfel de tip presupune: existena definiiei acestuia, apelul metodelor i
accesul la date.
Un exemplu de-acum clasic de tip de date abstract este STIVA. Ea poate
avea ca date: numerele naturale din stiv, capacitatea stivei, vrful etc. Iar
operaiile specifice pot fi:I ntroducerea n stiv ( push) i extragerea din stiv
( pop). La implementarea tipului STIVA, vom defini o structura de date care s
rein valorile memorate n stiv i cmpuri de datesimple pentru: capacitate,
numr de elemente etc. Vom mai defini metode (subprograme)capabile s
creeze o stiv vid, care s introduc o valoare n stiv, s extrag valoarea
dinvrful stivei, s testeze dac stiva este vid sau dac stiva este plin etc.
Crearea unei instane noi a unui tip obiectual, presupune operaii specifice
deconstruire a noului obiect, metoda corespunztoare purtnd numele de
constructor. Analog, la desfiinarea unei instane i eliberarea spaiului de
memorie aferent datelor sale, se aplic o metod specific numit
destructor.O aplicaie ce utilizeaz tipul obiectual STIVA, va putea construi
dou sau mai multe stive (de cri de joc, de exemplu), le va umple cu valori
distincte, va muta valori dintr-o stiv n alta dup o anumit regul desfiinnd
orice stiv golit, pn ce rmne o singur stiv.De observat c toate aceste
prelucrri recurg la datele, constructorul, destructorul i la metodele din
interfaa tipului STIVA descris mai sus.
Principalul tip obiectual ntlnit n majoritatea mediilor de dezvoltare
(Viisual Basic,Delphi, C++, Java, C#) poart numele de clas (class). Exist i

alte tipuri obiectuale (struct,object). O instan a unui tip obiectual poart


numele de obiect.
.La implementare, datele i metodele asociate trebuie s fie complet i corect
definite,astfel nct utilizatorul s nu fie nevoit s in cont de detalii ale
acestei implementri. El vaaccesa datele, prin intermediul proprietilor i va
efectua operaiile, prin intermediulmetodelor puse la dispoziie de tipul
obiectual definit. Spunem c tipurile de date obiectualerespect principiul
ncapsulrii.
Permind extensia tipurilor de date abstracte, clasele pot avea
la implementare:
date i metode caracterisitice fiecrui obiect din clas (membri de tip
instan),
date i metode specifice clasei (membri de tip clas).
Astfel, clasa STIVA poate beneficia, n plus, i de date ale clasei cum ar fi:
numrul de stive generate, numrul maxim sau numrul minim de
componente ale stivelor existente etc.
Modificatorul static plasat la definirea unui membru al clasei face ca acela s
fie un membru de clas, nu unul de tip instan. Dac n cazul membrilor
nestatici, exist cte unexemplar al membrului respectiv pentru fiecare
instan a clasei, membrii statici sunt unici,fiind accesai n comun de
toate instanele clasei. Mai mult, membrii statici pot fi referii fr acrea vreo
instan a clasei respective.
1.3. Suprancrcare
Dei nu este o tehnic specific programrii orientat obiect, ea creeaz un
anumit context pentru metodele ce formeaz o clas i modul n care acestea
pot fi (ca orice subprogram) apelate.Prin suprancarcare se nelege
posibilitatea de a defini n acelai domeniu devizibilitate
mai multe funcii cu acelai nume, dar cu parametri diferiti ca tip i/sau ca
numr.Astfel ansamblul format din numele funciei i lista sa de parametri
reprezint o modalitateunic de identificare numit semntur sau amprent.
Suprancrcarea permite obinereaunor efecte diferite ale apelului n contexte
diferite.Apelul unei funcii care beneficiaz, prin suprancrcare, de dou sau
mai multesemnturi se realizeaz prin selecia funciei a crei semntur se
potrivete cel mai bine culista de parametri efectivi (de la apel).Astfel, poate fi
definit metoda comand on-line cu trei semnturi diferite:
1)comanda_online(cod_prod)cu un parametru ntreg (desemnnd comanda
unui singur produs identificat prin cod_prod.
2)comanda_online(cod_prod,cantitate)cu primul parametru ntreg i celalalt
real
3)comanda_online(cod_prod,calitate)cu primul parametru ntreg i al-II-ilea
caracter.
86.Motenire. Polimorfism. Metode virtuale. Principiile programrii orientate
pe obiecte.
Pentru tipurile de date obiectuale class este posibil o operaie de extindere
sau specializare a comportamentului unei clase existente prin definirea unei
clase noi cemotenete datele i metodele clasei de baz, cu aceast ocazie
putnd fi redefinii unii membri existeni sau dugai unii membri noi.
Operaia mai poart numele de derivare.Clasa din care se motenetea se mai
numete clas de baz sau superclas. Clasacare motenete se numete
subclas , clas derivat sau clas descendent.

O subclas poate moteni de la o singur superclas, adic avem de-a face cu


motenire simpl; aceeai superclas ns poate fi derivat n mai multe
subclase distincte. O subclas, la randul ei, poate fi superclas pentru o alt
clas derivat.O clas de baz impreun cu toate clasele descendente (direct
sau indirect) formeaza oierarhie de clase. n C#, toate clasele motenesc de la
clasa de baz Object. n contextul mecanismelor de motenire trebuie amintii
modificatorii
Abstract i sealed aplicai unei clase, modificatori ce oblig la i respectiv se
opun procesului de derivare. Astfel, oclas abstract trebuie obligatoriu
derivat, deoarece direct din ea nu se pot obine obiecteprin operaia de
instaniere, n timp ce o clas sigilat (sealed) nu mai poate fi derivat (e
unfel de terminal n ierarhia claselor). O metod abstract este o metod
pentru care nu este definit o implementare, aceasta urmnd a fi realizat n
clasele derivate din clasa curent.O metod sigilat nu mai poate fi redefinit
n clasele derivate din clasa curent.
1.5. Polimorfism. Metode virtuale
Folosind o extensie a sensului etimologic, un obiect polimorfic este cel
capabil s ia diferite forme, s se afle n diferite stri, s aib comportamente
diferite. Polimorfismul obiectual se manifest n lucrul cu obiecte din clase
aparinnd unei ierarhii de clase, unde,prin redefinirea unor date sau metode,
se obin membri diferii avnd ns acelai nume.Astfel, n cazul unei referiri
obiectuale, se pune problema stabilirii datei sau metodei referite.
Comportamentul polimorfic este un element de flexibilitate care permite
stabilirea contextual, n mod dinamic, a membrului referit.
De exemplu, dac este definit clasa numit PIESA (de ah), cu metoda
nestatic muta(pozitie_initiala,pozitie_finala),atunci subclasele TURN i PION
trebuie s aib metoda muta definit n mod diferit (pentru a implementa
maniera specific a pionului de a captura o pies en passant). Atunci,
pentru un obiect T, aparinnd claselor derivate din PIESA, referirea la metoda
muta pare nedefinit.
Totui mecanismele POOpermit stabilirea, n momentul apelului, a clasei
proxime creia i aparine obiectul T iapelarea metodei corespunztore
(mutare de pion sau turn sau alt pies).Pentru a permite acest mecanism,
metodele care necesit o decizie contextual (n momentul apelului), se
decalr ca metode virtuale (cu modificatorul virtual). n mod curent, n C#
modificatorului virtual al funciei din clasa de baz, i corespunde un
specificator override al funciei din clasa derivat ce redefinete funcia din
clasa de baz.O metod ne-virtual nu este polimorfic i, indiferent de clasa
creia i aparine obiectul, va fi invocat metoda din clasa de baz.
Principiile POO:
Abstractizarea Este posibilitatea ca un program s ignore unele aspecte ale
informaiei pe care o manipuleaz, adic posibilitatea de a se concentra asupra
esenialului. Fiecare obiect n sistem are rolul unui actor abstract, care poate
executa aciuni, i poate modifica i comunica starea i poate comunica cu alte
obiecte din sistem fr a dezvlui cum au fost implementate acele facilitai.
Procesele, funciile sau metodele pot fi de asemenea abstracte, i n acest caz
sunt necesare o varietate de tehnici pentru a extinde abstractizarea:
ncapsularea numit i ascunderea de informaii: Asigur faptul c obiectele
nu pot schimba starea intern a altor obiecte n mod direct (ci doar prin
metode puse la dispoziie de obiectul respectiv); doar metodele proprii ale
obiectului pot accesa starea acestuia. Fiecare tip de obiect expune o interfa

pentru celelalte obiecte care specific modul cum acele obiecte pot
interaciona cu el.
Polimorfismul Este abilitatea de a procesa obiectele n mod diferit, n funcie
de tipul sau de clasa lor. Mai exact, este abilitatea de a redefini metode pentru
clasele derivate. De exemplu pentru o clas Figura putem defini o metod arie.
Dac Cerc, Dreptunghi, etc. ce vor extinde clasa Figura, acestea pot redefini
metoda arie.
Motenirea Organizeaz i faciliteaz polimorfismul i ncapsularea,
permind definirea i crearea unor clase specializate plecnd de la clase
(generale) deja definite - acestea pot mprti (i extinde) comportamentul
lor, fr a fi nevoie de a-l redefini. Aceasta se face de obicei prin gruparea
obiectelor n clase i prin definirea de clase ca extinderi ale unor clase
existente. Conceptul de motenire permite construirea unor clase noi, care
pstreaz caracteristicile i comportarea, deci datele i funciile membru, de la
una sau mai multe clase definite anterior, numite clase de baz, fiind posibil
redefinirea sau adugarea unor date i funcii noi. Se utilizeaz ideea:
Anumite obiecte sunt similare, dar n acelai timp diferite. O clas
motenitoare a uneia sau mai multor clase de baz se numete clas derivat.
Esena motenirii const n posibilitatea refolosirii lucrurilor care funcioneaz.