You are on page 1of 71

1. ISTORIA WINDOWS. CE ADUCE NOU WINDOWS. Conceptele i fundamentele GUI.

Consecvena privind
interfa cu utilizatorul. Avantajul oferit de multitasking. Gestionarea memoriei. Interfaa grafic
independent de dispozitiv

Crearea sistemului de operare Windows a fost anunat de Microsoft Corporation n noiembrie 1983, i doi ani mai
trziu, n noiembrie 1985, a fost lansat versiunea Windows 1.0. Versiunile lansate n urmtorii doi ani au fost
actualizate i adaptate pentru piaa internaional, furniznd noi drivere pentru alte plci video i inprimante. Sistemul
de operare Windows ofer avantaje semnificative fa de mediul MS-DOS, att pentru utilizatori, ct i pentru
programatori. Multe dintre aceste avantaje sunt comune pentru utilizatori i pentru programatori, deoarece sarcina
dezvoltatorilor unui program este s ofere utilizatorilor lucruri de care acetia au nevoie. Windows 95 face posibil acest
lucru.

Windows este o interfa grafic cu utilizatorul (GUI - graphical user interface), numit uneori i interfa vizual" sau
mediu grafic cu ferestre"Toate tipurile de interfee grafice cu utilizatorul folosesc elemente grafice afiate ntr-o
imagine de tip bitmap. Elementele grafice asigur o utilizare mai eficient a spaiului de afiare, un mediu bogat din
punct de vedere vizual pentru transferul de informaii i posibilitatea de afiare a rezultatelor aa cum vor arta n
realitate pe hrtie

Windows reprezint un SO complet , integrat pe 32 bii i care se distinge prin:

faciliti de conectare n reea;

faciliti de protected-mode;

faciliti de multitasking i multithreading;

AVANTAJUL OFERIT DE MULTITASKING

Prin multitasking noi putem intelege executarea simultana a mai multor taskuri.Traducerea corecta spune doar ca se
executa mai multe taskuri fara a se specifica simultaneitatea lor.

Avantajul multitaskingului ar fi ca el ne permite sa executam mai multe operatii de care avem nevoie in acelasi timp, de
aceea noi putem sa ne permitem comutarea rapida de la un context la altul .

Gestionarea memoriei

Un sistem de operare nu poate s implementeze multitaskingul fr o gestionare adecvat a memoriei. Pe msur ce noi
programe sunt ncrcate n memorie i altele vechi i ncheie execuia, memoria se poate fragmenta. Sistemul de
operare trebuie s aib posibilitatea s consolideze memoria liber. Pentru aceasta, sistemul trebuie s poat muta
blocuri de cod i de date n memorie.

Gestiunea memoriei are rolul de a decide cum trebuie organizat informaia pe cele dou nivele i cand trebuie
transferat informaia ntre acestea; tehnicile de gestiune a lucrrilor (multiprogramare, multitasking, time-sharing,etc)
implic existena unor metode eficiente pentru gestiunea memoriei: tehnici de alocare dinamic i memoria
virtual.Gestionarea memoriei trebuie s asigure urmtoarele funcii: -organizarea informaiilor n memoria intern
(gestionarea informaiilor);

-evidena ocuprii memoriei interne;

-organizarea schimbului de informaii ntre memoria intern i memoria extern (gestionarea schimbului de informaii);
asigurarea proteciei informaiilor memorate n memoria intern (protecia memoriei).

Interfaa grafic independent de dispozitiv

Interfata utilizator grafica (Graphical User Interface - GUI) permite utilizatorului sa comunice cu aplicatia, folosind n
acest scop obiecte grafice de pe ecran: ferestre, butoane, casete de validare, meniuri etc. Actionarea asupra acestora se
face folosind tastatura sau dispozitive de intrare speciale, dintre care cel mai raspndit este mouse-ul.

2 Apelurile de funcii. Arhitectura bazat pe mesaje. Procedura de fereastr. WinMain i WndProc.


Windows 95 asigur suportul pentru mai mult de o mie de apeluri de funcii pe care le pot folosi aplicaiile. Toate
funciile Windows importante sunt declarate n fiiere antet. Principalul fiier antet se numete WINDOWS.H i include
multe alte fiiere antet. Aceste fiiere antet sunt furnizate de orice mediu de programare pentru Windows 95, aa cum
este, de pild, C. Fiierele antet sunt o parte important a documentaiei Windows. n programele pentru Windows
folosii apelurile de funcii la fel cum folosii funciile de bibiotec C, cum ar fi strlen. Principala diferen este faptul c n
cazul funciilor C codul funciilor este legat direct de codul programului, pe cnd codul funciilor Windows este stocat n
fiiere din afara programului, numite biblioteci cu legturi dinamice
Apelurile de funcii Windows

Un program standard apeleaz nu mai puin de 17 funcii Windows. Aceste funcii, mpreun cu o scurt descriere,
sunt prezentate n continuare, n ordinea apariiei n program:
LoadIcon - ncarc o pictogram care urmeaz s fie folosit de un program.
LoadCursor - ncarc un indicator pentru mouse, care urmeaz s fie folosit de un program.
GetStockObject - obine un obiect grafic (n acest caz o pensul folosit pentru desenarea fondului ferestrei).
RegisterClassEx - nregistreaz o clas de fereastr pentru fereastra programului.
CreateWindow - creeaz o fereastr pe baza unei clase de fereastr.
ShowWindow - afieaz o fereastr pe ecran.
UpdateWindow - cere unei ferestre s se redeseneze.
GetMessage - preia un mesaj din coada de mesaje.
TranslateMessage - convertete unele dintre mesajele de la tastatur.
DispatchMessage - trimite un mesaj ctre o procedur de fereastr.
PlaySound - red un fiier de sunet.
BeginPaint - iniiaz o operaie de desenare a ferestrei.
GetClientRect - obine dimensiunile zonei client a ferestrei.
DrawText - afieaz un text.
EndPaint - ncheie o operaie de desenare.
PostQuitMessage - insereaz un mesaj de ncheiere n coada de ateptare.
DefWindowProc - execut operaiile prestabilite de prelucrare a mesajelor.

Arhitectura bazat pe mesaje

n Windows, atunci cnd utilizatorul redimensioneaz o fereastr, sistemul de operare trimite programului un mesaj
prin care i comunic noile dimensiuni ale ferestrei. Programul poate apoi s modifice coninutul ferestrei, astfel nct
acesta s se adapteze la noile dimensiuni.

sistemul de operare trimite programului un mesaj" - adica Windows apeleaz o funcie din program. Parametrii
acestei funcii descriu mesajul respectiv. Aceast funcie din programul Windows este cunoscut sub numele de
procedur de fereastr" (window procedure").
Procedura de fereastr

Orice fereastr creat de un program are asociat o procedur de fereastr. Procedura de fereastr este e funcie care
se poate afla chiar n program sau ntr-o bibliotec cu legturi dinamice (DLL). Windows trimite un mesaj ctre o
fereastr prin apelarea procedurii de fereastr. Procedura de fereastr prelucreaz anumite informaii pe baza mesajului
primit, apoi returneaz controlul sistemului de operare.

WinMain i WndProc

Funcia WndProc returneaz o valoare LRESULT, definit ca un numr de tip LONG. Funcia WinMain este de tipul
WINAPI, iar funcia WndProc este de tipul CALLBACK. Ambii identificatori sunt definii ca __stdcall, care definete o
secven special de apelare pentru apelurile de funcii dintre Windows i aplicaii.

WndProc - trateaza mesajele care vin de la sistemul de operare.Ea mai determina continutul care va fi afisat in zona
client al ferestrei si modul cum fereastra va raspunde la ceea ce va face utilizatorul.Deasemenea aceasta functie dupa ce
se apeleaza functia BeginPaint , invoca rutina GetClientRect.

WndProc- este o procedura de fereastra a ferestrei create de programul Hello.... iar o procedura de fereastra nu
reprezinta altceva decit un mod de incapsulare a codului care raspunde intrarilor si afiseaza elementele grafice pe ecran.

Funcia WinMain reprezint punctul de intrare n program. Aceasta este echivalentul funciei main din programele
scrise n limbajul C. Orice program pentru Windows trebuie s aib o funcie WinMain.

3. Atributele contextului de dispozitiv. Salvarea contextului de dispozitiv. Funciile LineTo, Polyline i


PolylineTo, PolyPolyline, Arc, PolyBezier i PolyBezierTo, Rectangle, Ellipse, RoundRect, Chord i Pie.

a) Contextul de dispozitiv (prescurtat DC - device context) - este o structur de date ntreinut intern de interfaa GDI.
Fiecare context de dispozitiv este asociat unui anumit dispozitiv de afiare, cum ar fi imprimanta, plotterul sau monitorul
video.O parte dintre valorile din contextul de dispozitiv sunt atribute grafice. Aceste atribute definesc unele
particulariti privind modul de lucru al unor funcii de desenare din interfaa GDI. n cazul funciei TextOut, de exemplu,
atributele contextului de dispozitiv determin culoarea textului, culoarea fondului, modul de mapare a coordonatelor x
i y n zona client a ferestrei i fontul folosit de Windows pentru afiarea textului.

Atributele contextului de dispozitiv controleaz caracteristicile textului afiat. De exemplu, unul dintre atributele
contextului de dispozitiv stabilete culoarea textului. Culoarea prestabilit este negru. De asemenea, contextul
prestabilit de dispozitiv stabilete ca fondul s fie alb. Atunci cnd un program afieaz un text pe ecran, Windows
folosete aceast culoare de fond ca s umple spaiul dreptunghiular care nconjoar fiecare caracter, spaiu numit
caset caracter" (character box")

b)Salvarea contextului de dispozitiv - Variabila handle a contextului de dispozitiv este eliberata de functia BeginPaint.
In general aceasta este salvata intr-o variabila numita hdc. In procedura de fereastra se defineste aceasta variabila astfel
: HDC 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.

c)Functiile :

Windows poate s deseneze linii drepte, linii eliptice (linii curbe, pe circumferina unei elipse) i curbe Bezier. Cele apte
funcii acceptate de Windows 95 pentru desenarea liniilor sunt LineTo (linii drepte), Polyline i PolylineTo (o serie de
linii drepte conectate), PolyPolyline (mai multe linii poligonale), Arc (linii eliptice), PolyBezier i PolyBezierTo
Functia Polyline foloseste ca punct de plecare pozitia curenta, si stabileste ca pozitie curenta sfirsitul ultimei linii
desenate.

Funcia LineTo este una dintre puinele funcii GDI care nu are nevoie de dimensiunile complete ale obiectului ce
urmeaz s fie desenat. Funcia LineTo deseneaz o linie de la poziia curent" definit n contextul de dispozitiv pan
la punctul specificat la apelarea funciei (exclusiv acest punct). Poziia curent este folosit ca punct de plecare i de alte
funcii GDI. Dac apelai funcia LineTo fr s stabilii mai nti poziia curent, funcia deseneaz o linie pornind din
colul din stnga-sus al zonei client.

Dac dorii s desenai o linie din punctul (xStart, yStart) pan n punctul (xEnd, yEnd) trebuie s apelai mai nti funcia
MoveToEx ca s stabilii ca poziie curent punctul (xStart, ySfart): (MoveToEx (hdc, xStart, yStart, &pt) ;)

LineTo (hdc, cxClient, cyClient) ;

Rectangle(hdc,xLeft,yTop,xRight,yBottom)(desenarea unui dreptunghi)

Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;( ne permite desenarea elipsei)

RoundRect (hdc, xLeft, yTop, xRight, yBottom, xCornerEllipse, yCornerEllipse) ;


(Funcia pentru desenarea unui dreptunghi cu colurile rotunjite )

Functiile PolyBezier si PoluBezierTo se folosesc pentru trasarea uneia sau a mai multor curbe Bezier conexe:
PolyBezier (hdc, pt, iCount) ;

sau instruciunea:

PolyBezierTo (hide, pt, iCount) ;

n ambele cazuri, pt este o matrice de structuri POINT. Pentru funcia PolyBezier primele patru puncte specific (n
aceast ordine) punctul de nceput, primul punct de control, al doilea punct de control i punctul final al curbei Bezier.
Urmtoarele curbe Bezier au nevoie doar de trei puncte, deoarece punctul de nceput al urmtoarei curbe Bezier este
punctul de sfrit al primei curbe, i aa mai departe. 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.

funciile Rectangle, Ellipse, RoundRect, Chord i Pie nu sunt tocmai nite funcii de desenare a liniilor. Desigur, ele
deseneaz i linii, dar i coloreaz zona nchis, cu pensula curent de colorare a suprafeelor. n mod prestabilit, aceast
pensul are culoarea alb, aa c s-ar putea ca operaia s nu fie att de evident atunci cnd ncercai pentru prima
dat s utilizai aceste funcii. Dei, n sens strict, funciile aparin unei alte seciuni din capitolul de fa, Desenarea
suprafeelor pline",

Funciile Arc, Chord i Pie primesc aceiai parametri:

Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
n cazul funciei Chord, Windows unete capetele arcului, iar n cazul funciei Pie, unete capetele arcului cu centrul
elipsei

PolyPolyline (mai multe linii poligonale),

4 BAZELE UTILIZARII CRONOMETRULUI

Cronometrul Windows este un dispozitiv de intrare, ce comunic periodic unei aplicaii trecerea unui anumit
interval de timp. Cronomestrul este mult mai util dect credei, i nu numai pentru programele care afieaz ora, aa
cum este ceasul afiat de Windows pe bara de taskuri. Iat cteva alte utilizri sub Windows ale cronometrului, dei s-ar
putea ca unele s nu fie att de evidente:
Multitaskingul - Dei Windows 95 este un mediu cu multitasking controlat, uneori este mult mai eficient ca un
program s returneze controlul sistemului de operare, imediat ce este posibil. Dac programul trebuie s
execute o operaie de durat, o poate mpri n operaii mai mici, pe care s le prelucreze la primirea unui
mesaj WMJTIMER. (Vom discuta mai multe despre acest subiect n Capitolul 14.)
Actualizarea unui raport de stare - Un program poate s utilizeze cronometrul pentru afiarea n timp real" a
unor informaii care se schimb continuu, n funcie de resursele sistemului sau de evoluia unei anumite
operaii.
Implementarea unei caracteristici de autosalvare" - Cronometrul poate s aminteasc" unui program Windows
s salveze pe hard-disc documentul la care lucreaz utilizatorul, dup trecerea unui anumit interval de timp.
nchiderea versiunilor demonstrative ale unui program - Unele versiuni demonstrative ale programelor sunt
proiectate astfel nct s-i ncheie execuia, de exemplu, dup trecerea a 30 de minute de la lansare. Cronometrul
poate s semnaleze unei astfel de aplicaii terminarea timpului permis de rulare.
Deplasri succesive - Obiectele grafice dintr-un joc sau imaginile afiate succesiv de un program de instruire
asistat de calculator trebuie s fie prelucrate la anumite intervale de timp. Folosirea cronometrului elimin
inconsecvenele care pot aprea datorit diferenelor dintre viteza de lucru a microprocesoarelor.
Multimedia - Programele pentru redarea CD-urilor audio, a sunetelor sau a secvenelor muzicale sunt rulate de multe ori
n fundal. Un program poate s utilizeze cronometrul pentru a determina ct a fost redat din secvena audio i a
actualiza corespunztor informaiile vizuale afiate

5 Care este punctul de intrare ntr-un program Windows

Funcia WinMain reprezint punctul de intrare n program. Aceasta este echivalentul funciei main din programele scrise
n limbajul C. Orice program pentru Windows trebuie s aib o funcie WinMain

6 CE ADUCE NOU SISTEMUL DE OPERARE WINDOWS

Sistemul de operare Windows ofer avantaje semnificative fa de mediul MS-DOS, att pentru utilizatori, ct i pentru
programatori. Multe dintre aceste avantaje sunt comune pentru utilizatori i pentru programatori, deoarece sarcina
dezvoltatorilor unui program este s ofere utilizatorilor lucruri de care acetia au nevoie. Windows 95 face posibil acest
lucru.

7.Ce este notatia ungara ?

notaia ungar", o convenie de denumire a variabilelor intitulat astfel n onoarea legendarului programator de la
Microsoft, Charles Simonyi. Convenia este foarte simpl - fiecare nume de variabil ncepe cu una sau mai multe litere
mici care specific tipul de date al variabilei. De exemplu, prefixul sz al variabilei szCmdLine semnific ir de caractere
terminat cu zero". Prefixul h al variabilelor hInstance i hPrevInstance nseamn variabil handle"; prefixul i al variabilei
iCmdShow nseamn ntreg". i ultimii doi parametri ai funciei WndProc respect notaia ungar, dei, aa cum am
artat mai devreme, wParam ar fi trebuit s se numeasc uiParam (de la unsigned integer"). Totui, deoarece aceti doi
parametri se definesc folosind tipurile de date WPARAM i LPARAM, am pstrat denumirile originale.
8 Ce este o variabil handle i care este destinaia ei?

Variabila handle este de obicei un nr pe 32 biti, care face trimitere la un obiect. Valoarea real a variabilei
handle nu este important pentru program, dar modulul Windows care o furnizeaz programului tie cum s l
manipuleze pentru trimiterea la obiect.

9 Ce este programare controlat de evenimente?

Programarea orientat eveniment este o paradigm a programrii calculatoarelor. Spre deosebire de programele
tradiionale, care-i urmeaz propria execuie, schimbndu-i cteodata doar cursul n puncte de ramificaie (instruciuni
test, etc), cursul execuiei unui program orientat eveniment este condus n mare parte de evenimente externe.
Programele orientate eveniment sunt formate de obicei dintr-un numr de programe mici numite handlere de
eveniment, care sunt apelate ca rspuns la evenimente externe i dintr-un coordonator (dispatcher), care apeleaz
handlerele de evenimente, folosind de obicei o coad a evenimentelor, care s rein evenimentele care nu au fost
procesate.
n multe cazuri, handlerele de evenimente pot declana ele nsele evenimente, ducnd la o cascad de evenimente.
Programarea orientat eveniment accentueaz ca virtui flexibilitatea i asincronicitatea.
Programele cu interfee grafice sunt de obicei programate ntr-o modalitate gestionat de evenimente. Sistemele de
operare sunt un alt exemplu clasic de programe dirijate de evenimente pe cel puin dou nivele. La cel mai de jos nivel,
handlerele de ntreruperi se comport ca handlere de evenimente hardware, cu procesorul n rol de coordonator
(dispatcher). Sistemele de operare, de asemenea se comport ca i coordonatori pentru procese, transmind datele i
ntreruperile soft ctre procese user, care de multe ori sunt programate ca i handlere de eveniment.

10. Ce este un device context

Device Context structura de date intretinuta intern de interfata GDI.O parte din valorile din DC sunt atributele grafice ,
ce definesc careva particularitati referitor la modul de lucru a unor functii de desenare din interfata GDI.

11 Ce este multitaskingul controlat?

Prin multitasking noi putem intelege executarea simultana a mai multor taskuri.In versiunile anterioare ale Windowsului
era folosit multitaskingul necontrolat, ceea ce insemna ca nu se folosea ceasul sistemului ca sa se aloce timpi de
procesare a diferitor programe ce rulau in sistem. Multitaskingul controlat insa permite aceasta alocare a timpilor de
procesare , ceea ce inseamna ca programele cedeaza voluntar controlul , astfel incit alte programe sa isi poate si ele
continua executia.In Windows 95 multitaskingul este controlat si programele se pot imparti in mai multe fire de
executie, care par sa ruleze in acelasi timp.

12 Ce facem dac cronometrul nu este accesibil?

Cronometrul Windows este un dispozitiv de intrare, ce comunic periodic unei aplicaii trecerea unui anumit interval de
timp. Programul specific sistemului de operare acest interval de timp, spunndu-i ceva de genul: F-mi un semn la
fiecare 10 secunde". Windows trimite periodic programului, mesaje WM_TIMER prin care i semnaleaz trecerea
intervalului de timp respectiv.
Dac nu este disponibil nici un cronometru, funcia SetTimer returneaz valoarea NULL. S-ar putea ca programul s
funcioneze la fel de bine i fr un cronometru, dar dac ntr-adevr avei nevoie de un cronometru ,aplicaia nu are
alt soluie dect s-i ncheie execuia. Dac apelai funcia SetTimer din WinMain, putei s nchidei programul ieind
din funcia WinMain cu valoarea de returnare FALSE.
S presupunem c avei nevoie de un cronometru cu durata de 1000 ms. Dup apelarea funciei CreateWindow, dar
nainte de intrarea n ciclul de tratare a mesajelor, putei s includei urmtoarea instruciune:
if (!SetTimer (hwnd, 1, 1000, NULL)) return FALSE ;
Acesta este un mod neprietenos de nchidere a unui program.
Secvena de cod din exemplul urmtor afieaz o caset de mesaje atunci cnd funcia SetTimer nu poate aloca
programului un cronometru:
if (!SetTimer (hwnd, 1, 1000, NULL))
{
MessageBox (hwnd, "Too many clocks or timers!", "Program Name", MB_ICONEXCLAMATION ] MB_OK);
return FALSE ;
}
13 Ce prezint procedura unei ferestre?
Orice fereastr creat de un program are asociat o procedur de fereastr. Procedura de fereastr este e funcie care
se poate afla chiar n program sau ntr-o bibliotec cu legturi dinamice (DLL). Windows trimite un mesaj ctre o
fereastr prin apelarea procedurii de fereastr. Procedura de fereastr prelucreaz anumite informaii pe baza mesajului
primit, apoi returneaz controlul sistemului de operare. Procedura de fereastra- mai este si un mod de incapsulare a
codului care raspunde intrarilor(de la tastatura/mouse) si afiseaza elementele grafice pe ecran,facind acest lucru prin
prelucrarea mesajelor trimise catre fereastra.

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.

Sistemul 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 Dreptunghi cu coluri drepte

Ellipse Elips

RoundRect Dreptunghi cu coluri rotunjite


Arc pe circumferina unei elipse, avnd capetele unite printr-o
Chord
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:

66. hBrush = CreateSolidBrush (rgbColor) ;


67. 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.
68. hBrush = CreatePatternBrush (hBitmap) crearea unei pensule proprii, bazat pe o imagine bitmap.
69. 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").

21. 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:

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 mouse-ul 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 mouse-ului 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.
BS_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.
29. Ferestre child. Clasa barelor de derulare
30. Ferestre child. Clasa de redactare.
31. Ferestre child. Clasa static
32. Ferestre child. Coduri de ntiinare

Ferestrele descendent pot comunica cu ferestrele printe n ambele sensuri. Ferestrele descendent genereaz
mesaje WM_COMMAND, care le transmite ferestrei printe. lParam conine variabila handle a ferestrei descendent,
LOWORD (wParam) conine identificatorul ferestrei descendent, HIWORD (wParam) conine codul de ntiinare
transmis ferestrei printe. Exemplu de cod de ntiinare: BN_CLICKED (valoarea 0), BN_PUSHED (valoarea 2), etc.

33. Ferestre child. Colorarea barelor de derulare i a textului static.


Colorarea barelor de derulare se face prin tratarea mesajelor WM_CTLCOLORSCROLLBAR. Ca rspuns la acest
mesaj, fereastra printe poate utiliza contextul de dispoztitv pentru a seta culoarea barei. De fapt tratarea acestui mesaj
returneaz variabila handle a pensulei utilizate pentru desenarea barei de derulare.
n cazul textului static este tratat mesajul WM_CTLCOLORSTATIC, ulterior apelndu-se funciile SetBkColor() - pentru
fundal sau SetTextColor() pentru text.

34. Ferestre child. Colorarea fondului.


(*traducere din englez Petzold BackGround Color)
n mod implicit, ferestrele descendent sunt desenate utiliznd pensula de culoare gri, pentru c butoanele au fost create
pentru a fi utilizate n casetele de dialog, a cror fundal este de aceast culoare. Setarea culorii de fundal a ferestrei
printe se face n timpul setrii parametrilor clasei ferestrei: wndclass.hbrBackground = (HBRUSH) GetStockObject
(WHITE_BRUSH).
Pentru a adapta culoarea ferestrei descendent la culoarea fundalului ferestrei printe vom fi nevoii ori s schimbm
modalitatea de desenare a fundalului ferestrei printe, ori s schimbm culoarea ferestrei descendent. O modalitate de
a nelege cum aceasta se face este nelegerea culorilor de sistem (ntrebarea 35)

(Petzold Coloring the Background - ** cred c proful asta a avut n vedere)


n programul cu bare de derulare, care schimb culoarea fundalului ferestrei printe, culoarea de fundal este setat n
felul urmtor: wndclass.hbrBackground = CreateSolidBrush (0)
Atunci cnd este mutat bara de derulare, programul trebuie s creeze o nou pensul i s transmit variabila handle a
pensulei structurii clasei de fereastr. Accesarea acestei variabile handle se face prin apel la funcia GetClassWord., iar
setarea prin SetClassWord.
Atunci cnd oricare dintre bare i schimb poziia, se terge pensula folosit i se creeaz una nou prin apel la funcia:
SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush (RGB (color[0],color[1], color[2]))))
Cnd este necesar recolorarea fundalului se apeleaz InvalidateRect(), ceea ce determin plasarea n coad a unui mesaj
WM_PAINT. Astfel nct acesta este un mesaj de prioritate joas, el nu va fi procesat att timp ct se porceseaz mesajele
provenite de la barele de derulare. Putem corecta acest lucru prin apel implicit al funciei UpdateWindow(hWnd). Totui
UpdateWindow() poate frna interpretarea tastelor mouse-ului i a tastaturii. Putem deci transmite tratarea mesajelor
WM_PAINT funciei DefWindowProc(), ceea ce nseamn ca programul nostru va trata doar un BeginPaint() i EndPaint()
atunci cnd i va fi trimis un mesaj WM_PAINT.

35. Ferestre child. Culori de sistem.

SO Windows utilizeaz 29 de culori pentru a desena diferite componente artate la ecran. Aceste 29 de culori pot fi
accesate prin GetSysColor() i modificate prin SetSysColor(). Identificatorii definii n fiierele header specific culorile de
sistem.
**Setarea culorii de sistem prin SetSysColor() se face doar pentru sesiunea de Windows curent.
Culorile de sistem (unele) pot fi modificate i din Control Panel. Culorile selectate sunt stocate n registru pentru WinNT
i n fiierul WIN.INI pentru Win98. Att n registru, ct i n fiierul WIN.INI, cuvintele cheie pentru culorile de sistem sunt
diferite de identificatorii utilizai la apelurile funciilor GetSysColor() sau SetSysColor().
Exemplu: Identificatorul GetSysColor() sau SetSysColor() COLOR_SCROLLBAR
Identificatorul din registru sau WIN.INI Scrollbar
Culoarea standard RGB C0C0C0
Este utilizat pentru setarea culorii barelor de derulare.
** Progresul SO Windows a determinat utilizarea elementelor grafice mai sofisticate, incluznd diferite elemente 3D,
ceea ce a determinat mrirea numrului culorilor de sistem. Astfel, pentru versiunile mai recente de Windows,
identificatorii culorilor pot s nu mai fie att de explicii:
COLOR_SCROLLBAR seteaz culoarea barelor de derulare.

36. Ferestre child. Interfaa tastaturii


Barele de derulare pot procesa acionrile butoanelor de la tastatur. Astfel acionarea butoanelor Home, End,
Page Up, Page Down genereaz diferite valori pentru parametrul wParam, n cazul mesajelor legate de barele de
derulare: SB_TOP, SB_BOTTOM, SB_PAGEUP, SB_PAGEDOWN respectiv.
Pentru a transmite input focus-ul barei de derulare atunci cnd este acionat cu mouse-ul, trebuie inclus
identificatorul WS_TABSTOP atunci cnd se creaz fereastra descendent prin CreateWindow().
Ulterior trebuie tratat mesajul WM_SETFOCUS, apelndu-se funcia SetFocus (hwndScroll[idFocus]), unde
hWndScroll este variabila handle a ferestrei descendent, iar idFocus o variabil global.
Atribuirea input focus-ului barei de derulare determin utilizarea interfeei complete a tastaturii de ctre bara de
derulare. Oricum, aceasta va ignora o bun parte din butoane, axndu-se doar pe cele, care determin poziia cursorului.

37. Ferestre child. Introducerea unei proceduri de fereastr noi.

Presupunem c avem situaia: avem mai multe bare de derulare n zona client i este necesitatea de a transmite
input focus-ul de la una la alta prin intermediul tastei Tab. Dificultatea o reprezint faptul c o bar de derulare deja
deine input focus-ul i ignor apsarea Tab-ului.
Pentru a rezolva aceast problem trebuie introdus o nou procedur de fereastr pentru fereastra descendent,
care va trata anumite mesaje, de care avem nevoie i va transmite controlul procedurii de fereastr implicite. Setarea
unei noi proceduri de fereastr se face prin apel la funcia SetWindowLong().
Astfel, pentru fiecare dintre barele de derulare prezente se apeleaz aceast funcie:
OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC,(LONG) ScrollProc))
n rezultat, ScrollProc va recepiona toate mesajele, pe care SO le trimite barelor de derulare n cadrul programului.

38. Ferestre child. Mesajul WM_CTLCOLORBTN.

Astfel nct este posibil de a seta culoarea zonei client i a textului afiat, astfel nct culoarea acestora s coincid cu
culoarea butoanelor i a ferestrelor descendent. Apare ntrebarea: este posibil de a adapta culoarea butoanelor la
culorile pe care le preferm? Teoretic da, practic nu, pentru c unica posibilitate de a o face este funcia
SetSysColor(). ns aceast funcie determin schimbarea tuturor culorilor n sistem ceea ce le-ar schimba n toate
aplicaiile, care ruleaz curent n Windows.
O alt modalitate (teoretic) mai bun este tratarea mesajelor WM_CTLCOLORBTN. Acest mesaj este trimis de ctre
fereastra descendent atunci cnd aceasta i deseneaz zona client. Aici este cazul de a schimba culorile, pe care
fereastra descendent le folosete pentru a colora fundalul: SetBkColor() sau pentru a scrie un text: SetTextColor().
Problema care apare este faptul c doar butoanele de tip Push sau cele desenate de utilizator trimit astfel de mesaj
ferestrei printe i doar butoanele owner-draw (desenate de utilizator) rspund la procesarea acestui mesaj de ctre
fereastra printe, ceea ce, de fapt, este inutil pentru c n final anume fereastra printe este responsabil de desenarea
butoanelor.
39. Ferestre child. Radio buttons.

Radio buton este o fereastr descendent, care, n grup, permit alegerea unor opiuni, care se exclud reciproc. Arat ca o
caset de validare, numai c n loc de caset este un cercule alb, care, n caz c este validat, este marcat de un cercule
negru mai mic.
Indicatorii utilizai pentru crearea unui buton radio: BS_RADIOBUTTON, BS_AUTORADIOBUTTON.
Diferena ntre acetia este faptul c pentru primul trebuie controlat manual marcarea lui, adic pentru a permite
validarea acestuia trebuie apelat funcia SendMessage() cu parametrul BM_SETCHECK i wParam egal cu 1:
SendMessage (hwndButton, BM_SETCHECK, 1, 0)
Auto-radio-butonul se valideaz automat la acionarea lui prin intermediul unui dispozitiv de intrare (mouse, tastatur).
Stingerea butoanelor radio, adic interzicerea validrii lor se face prin apel la funcia SendMessage (hwndButton,
BM_SETCHECK, 0, 0), unde wParam este egal cu 0.
**Diferena substanial ntre o caset de validare i buton radio este faptul c un buton radio nu poate fi invalidat prin
apsare repetat. El este asemntor cu butoanele cu ajutorul crora se alege frecvena radio prestabilit din
automobile: doar un buton poate fi acionat ntr-un moment de timp.

40. Ferestre child. Stilurile clasa de redactare

Implicit o fereastr descendent de editare are doar o singur linie. ES_MULTILINE transform fereastra de editare ntr-
una cu mai multe linii. ES_AUTOVSCROLL automat deruleaz pe vertical textul scris, iar ES_AUTOHSCROLL pe
orizontal. Pentru adugarea barelor de derulare n fereastra de editare, trebuie folosii indicatorii barelor de derulare
standard WS_HSCROLL, WS_VSCROLL.
Atunci cnd este ales un text, el nceteaz s fie evideniat cnd fereastra de editare pierde input-focus-ul. Pentru a
preveni acest fapt trebuie folosit indicatorul ES_NOHIDESEL. Toi aceti indicatori determin stilul ferestrei de editare.

41. Ferestre child. Utilizarea ferestrelor de redactare de control

Atunci cnd se utilizeaz mai multe ferestre de editare, este necesar de a utiliza principiul windows subclassing pentru a
semnala trecerea de la o fereastr de editare la alta, adic de a crea o procedur de fereastr specific pentru fiecare
fereastr de editare. O alt modalitate este interceptarea butoanelor Tab sau Shift-Tab.
Exist diverse mesaje pentru interacionarea cu textul introdus n caseta de editare. Toate aceste mesaje sunt trimise
prin intermediul funciei SendMessage(), utiliznd indicatorul necesar WM_COPY, WM_CUT, etc.
Se poate obine nceputul irului i sfritul acestuia (SendMessage (hwndEdit, EM_GETSEL, (WPARAM)
&iStart,(LPARAM) &iEnd)), poate fi nlocuit textul cu un alt ir (SendMessage (hwndEdit, EM_REPLACESEL, 0,
(LPARAM) szString)) sau obinut numrul de linii (iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0)
;).
42.Ferestre. Culoarea butoanelor.

O fereastra child (copil) este o fereastra care are setat stilul WS_CHILD si are urmatoarele proprietati:

are o fereastra parent (parinte);


sta intotdeauna in zona client a ferestrei parinte (nu poate fi afistata in afara);
daca fereastra parinte este mutata, fereastra copil este mutata in acelas fel (pozitia ei relativa la zona client a
parintelui nu se schimba);
este distrusa atunci cand se distruge fereastra parinte.
o fereastra child nu poate avea menu;

Pentru a crea o fereasta child, trebuie setat stilul WS_CHILD si pasat un handle la parinte in apelul functiei
CreateWindow sau CreateWindowEx;
Colorarea butoanelor poate fi modificata doar teoretic, nu si in practica. Putem utiliza funcia SetSysColors ca s
modificam aspectul butoanelor. Aceasta 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 (din nou, 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. (In versiunile pe 16 bii ale sistemului de
operare Windows, un mesaj numit WM_CTLCOLOR era folosit pentru toate controalele. Acesta a fost nlocuit cu mesaje
separate pentru fiecare tip standard de control.)

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:

Stabilii (opional) o culoare de text cu ajutorul funciei SetTextColor.


Stabilii (opional) o culoare de fond cu ajutorul funciei SetBkColor.
Returnai ctre fereastra descendent o variabil de manipulare a pensulei
cu care se va desena.

Teoretic, fereastra descendent folosete pensula respectiv pentru colorarea fondului. Este sarcina dumneavoastr
s distrugei pensula atunci cnd aceasta nu mai este necesar.

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.

Dac dorii s avei controlul complet asupra aspectului vizual al butoanelor, dar nu vrei s v pierdei timpul cu logica
de tratare a intrrilor de la mouse i de la tastatur, creai un buton cu stilul BS_OWNERDRAW.

43. Ferestrele child de control

Controalele de tip fereastr descendent sunt folosite de cele mai multe ori n casetele de dialog. Aa cum vei
vedea n Capitolul 11, poziia i dimensiunea controalelor de tip fereastr descendent sunt definite ntr-un ablon al
casetei de dialog, coninut n fiierul de resurse al programului. Pentru crearea unei ferestre normale a aplicaiei, definii
mai nti clasa ferestrei i o nregistrai n Windows cu ajutorul funciei RegisterClassEx. Pe baza acestei clase creai apoi
fereastra cu ajutorul funciei CreateWindow. Totui, atunci cnd folosii unul dintre controalele predefinite, nu trebuie s
nregistrai o clas pentru fereastra descendent. Clasa exist deja n Windows i are unul dintre aceste nume: button",
static", scrollbar", edit", listbox" sau combobox". Nu trebuie dect s folosii unul dintre aceste nume 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.
Folosirea controalelor de tip fereastr descendent direct pe suprafaa ferestrei implic executarea unor operaii de nivel
mai sczut dect n cazul folosirii controalelor de tip fereastr descendent n casetele de dialog, deoarece gestionarul
casetei de dialog insereaz un nivel de izolare ntre program i controale. Controalele de tip fereastr descendent pe care
le creai pe suprafaa ferestrei nu v ofer ns posibilitatea de deplasare a cursorului de intrare de la un control la altul
cu ajutorul tastei Tab sau al tastelor de deplasare. Un control de tip fereastr descendent poate obine cursorul de
intrare, dar, dup ce obine acest cursor, nu l va mai ceda ferestrei printe.

44. Folosirea penielor de stoc. Crearea, selectarea i tergerea penielor. Funciile CreatePen,
CreatePenIndirect, ExtCreatePen. Parametrii iPenStyle, iWidth, rgbColor.

Iat o metod pentru crearea, selectarea i tergerea penielor.Mai nti definim variabilele pentru stocarea
variabilelor handle ale stilurilor:

static HPEN hPen;

n timpul prelucrrii mesajului WM_CREATE, cream penita.

hPen = CreatePen (PS_SOLID, 1, 0);

n timpul prelucrrii mesajului WM_PAINT (sau n orice alt moment n care avem o variabil handle valid a
contextului de dispozitiv) putem s selectam oricare dintre penie n contextul de dispozitiv i s desenam:

SelectObject (hdc, hPen) ;

[funcii de desenare a liniilor]

n timpul prelucrrii mesajului WM_DESTROY putem s tergem peniele create:

DeleteObject (hPen) ;

Folosind funciile CreatePen sau CreatePenIndirect putem crea o peni logic" (logical pen) care este doar o descriere a
unei penie.

Funciile CreatePen, CreatePenIndirect i ExtCreatePen returneaz o variabil handle a peniei logice create.

Parametrul iPenStyle precizeaz dac se deseneaz o linie continu, o linie punctat sau una ntrerupt.
Pentru stilurile PS_SOLID, PS_NULL i PS_INSIDEFRAME, parametrul iWidth reprezint grosimea liniei. Dac iWidth are
valoarea 0, liniile desenate de Windows vor avea grosimea de un pixel. Dac parametrul iWidth are o valoare mai mare
de 1, Windows va desena o linie continu.

Parametrul rgbColor din funcia CreatePen este un numr ntreg fr semn reprezentnd culoarea peniei.

45. Formatarea textului. Funcia wsprintf. Funcia GetSystemMetrics.

Deoarece dimensiunile fontului sistem nu se modific n timpul unei sesiuni Windows, trebuie s apelam funcia
GetTextMetrics o singur dat dup lansarea n execuie a programului. Un loc potrivit pentru acest apel este codul de
prelucrare a mesajului WM_CREATE din procedura de fereastr.

Pentru a afisa mai multe linii de text avem nevoie s obinem valorile pentru nlimea i limea caracterelor. Acest
lucru se poate realiza prin definirea a dou variabile n care s salvam limea medie (cxChar) i nlimea total a
caracterelor (cyChar):

static int cxChar, cyChar ;

Aceste variabile sunt declarate ca statice deoarece trebuie s fie valide atunci cnd procedura de fereastr
prelucreaz alte mesaje (cum ar fi WM_PAINT). Dac variabilele sunt declarate ca globale n alte funcii nu mai este
necesar s fie declarate statice.

Codul de prelucrare a mesajului WM_CREATE:


case WH_CREATE:

hdc = GetDC (hwnd);

GetTextMetrics (hdc, &tm);

cxChar = tm.tmAveCharWidth;

cyChar = tm.tmHeight + tm.tmExternalLeading;

ReleaseDC (hwnd, hdc);

return 0;

Funcia GetSystemMetrics returneaz informaii despre dimensiunea unor elemente grafice din Windows, cum ar fi
pictograme, cursoare, bare de titlu i bare de derulare. Aceste dimensiuni depind de placa video i de driverul de afiare.
Funcia GetSystemMetrics accept un singur parametru, numit index". Indexul este unul dintre cei 73 de identificatori
de tip ntreg definii n fiierele antet din Windows. GetSystemMetrics returneaz o valoare ntreag care reprezint, de
obicei, dimensiunea elementului transmis ca parametru.

Functiile wsprintf si sprintf permit afisarea numerelor formatate, cat si siruri simple de caractere. Dac nu trebuie s
afiam numere n virgul mobil, putem folosi funcia wsprintf n locul funciei sprintf. Funcia wsprintf are aceeai
sintax ca i funcia sprintf, dar este inclus n Windows, aa c nu va mri dimensiunea fiierului executabil. Diferenta
dintre printf si wsprintf este ca irul de caractere formatat este stocat ntr-o matrice de caractere, si returneaz lungimea
irului de caractere.

46. Funcia GetDeviceCaps. Dimensiunea dispozitivului. Valorile HORZSIZE i VERTSIZE, HORZRES i


VERTRES, ASPECTX, ASPECTY i ASPECTXY, LOGPIXELSX i LOGPIXELSY.

Functia GetDviceCaps() furnizeaz informaii despre posibilitile contextului de dispozitiv.

Avem nevoie de rezoluia vertical (numrul de dots tipribili de la nceputul paginii pn la sfritul ei), deci vom
furniza ca parametru constanta VERTRES, n funcia GetDeviceCaps().

Constanta HORZRES n aceeai funcie ne furnizeaz rezoluia orizontal.

HORZSIZE - Limea, n milimetri, a ecranului fizic.

VERTSIZE - nlimea, n milimetri, a ecranului fizic.

ASPECTX - Limea relativ a unui pixel folosit pentru desenarea unei linii.

ASPECTY - nlimea relativ a unui pixel folosit pentru desenarea unei linii.

ASPECTXY- Lime pe diagonal a pixelului folosit pentru desenarea unei linii.

LOGPIXELSX - Numrul de pixeli pe inch logic de-a lungul limii ecranului. ntr-un sistem cu mai multe monitoare de
afiare, aceast valoare este aceeai pentru toate monitoarele.

LOGPIXELSY - Numrul de pixeli pe inch logic de-a lungul nlimii ecranului. ntr-un sistem cu mai multe monitoare
de afiare, aceast valoare este aceeai pentru toate monitoarele.

GetDeviceCaps() accept un numr de 29 de constante diferite .


47. Funcia TextOut. Contextul de dispozitiv. Obinerea unei variabile handle a contextului de dispozitiv:

Contextul de dispozitiv (prescurtat DC - device context) este o structur de date ntreinut intern de interfaa GDI.
Fiecare context de dispozitiv este asociat unui anumit dispozitiv de afiare, cum ar fi imprimanta, plotterul sau monitorul
video. n cazul monitoarelor video, un context de dispozitiv este de obicei asociat unei anumite ferestre de pe ecran.

Prima metoda de a obtine variabila handle este in timpul prelucrarii mesajelor WM_PAINT.

Sunt implicate dou funcii: BeginPaint i EndPaint. Aceste funcii au nevoie de variabila handle a ferestrei (transmis
procedurii de fereastr ca parametru) i de adresa unei variabile de tipul PAINTSTRUCT. De obicei, programatorii
Windows numesc aceast variabil ps i o definesc n procedura de fereastr astfel:

PAINTSTRUCT ps;

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. n prcedura de fereastr definii aceast variabil
astfel:

HDC hdc;

Tipul de date HDC este definit ca un ntreg fr semn, pe 32 de bii. Programul poate apoi s foloseasc funcii GDI,
cum ar fi TextOut. Apelul funciei EndPaint elibereaz variabila handle a contextului de dispozitiv.

n general, prelucrarea mesajului WM_PAINT se face astfel:

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

[apelarea unor funcii GDI]

EndPaint (hwnd, &ps) ;

return 0 ;

Obinerea unei variabile handle a contextului de dispozitiv: a doua metod

Putei s obinei o variabil handle a unui context de dispozitiv i n timpul prelucrrii altor mesaje dect
WM_PAINT, sau atunci cnd avei nevoie de variabila handle a contextului n alte scopuri, cum ar fi obinerea unor
informaii despre contextul de dispozitiv. Apelai funcia GetDC pentru a obine variabila handle i apoi apelai funcia
ReleaseDC atunci cnd nu mai avei nevoie de aceasta:

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. Atunci cnd
apelai funcia GetDC n timpul prelucrrii unui mesaj, este recomandat s apelai funcia ReleaseDC nainte de a iei din
procedura de fereastr. Nu apelai funcia GetDC ca rspuns la un mesaj i funcia ReleaseDC ca rspuns la un alt mesaj.
Spre deosebire de variabila handle a contextului de dispozitiv obinut din structura PAINTSTRUCT, variabila handle
returnat de funcia GetDC se refer la un dreptunghi cu ntreaga zon client a ferestrei. Putei s desenai n orice parte
a zonei client, nu doar n dreptunghiul invalid (dac exist un dreptunghi invalid). Spre deosebire de funcia BeginPaint,
GetDC nu valideaz nici o regiune invalid.

Funcia TextOut afieaz pe ecran un ir de caractere.

Are forma : TextOut (hdc, x, y, psString, iLength) ;

Primul parametru este o variabil handle a contextului de dispozitiv - valoarea hdc returnat de funcia GetDC sau
valoarea hdc returnat de funcia BeginPaint n timpul prelucrrii mesajului WM_PAINT.

Parametrul psString este un pointer la un ir de caractere, iar iLength este lungimea acestui ir de caractere, adic
numrul de caractere coninut de ir.

Valorile x i y din apelul funciei TextOut definesc nceputul irului de caractere n zona client a ferestrei. Valoarea x
indic poziia pe orizontal, iar valoarea y indic poziia pe vertical.

48. Funciile SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw), SetScrollPos (hwnd, iBar, iPos,
bRedraw).

Funcia de SetScrollRange stabilete valorile minime si maxime pentru bara de defilare specificata.

Are forma : 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 dac vrei 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. 8. Putei s folosii funcia SetScrollPos ca s
stabilii o nou poziie a casetei de derulare pe bara de derulare:

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.

49. Ignorarea tastaturii. Cursorul de intrare. Acionri de taste i caractere

Ignorarea tastaturii
Dei tastatura este principala surs de intrri de la utilizatori a unui program pentru Windows, programele nu
trebuie s reacioneze la toate mesajele pe care le primete de la tastatur. Multe funcii ale tastaturii sunt tratate chiar
de Windows. De exemplu, putei s ignorai apsrile de taste legate de funcii sistem. Acestea sunt, n general,
combinaii cu tasta Alt.

Programul nu este obligat s monitorizeze aceste taste, deoarece Windows i comunic efectul acestora. (Totui,
dac este nevoie, programul poate face i acest lucru.) De exemplu, dac utilizatorul selecteaz un articol dintr-un meniu
cu ajutorul tastaturii, Windows trimite programului un mesaj prin care i comunic articolul de meniu selectat, indiferent
dac utilizatorul a folosit mouse-ul sau tastatura.
Unele programe pentru Windows folosesc acceleratori" (sau taste de accelerare") pentru opiunile de meniu
folosite mai frecvent. Acceleratorii sunt, de obicei, combinaii de taste funcionale - sau alte taste corespunztoare unor
caractere - cu tasta Ctrl. Tastele de accelerare sunt definite n fiierul de resurse al programului.

Tastatura trebuie s fie partajat de toate aplicaiile rulate simultan sub Windows. Unele aplicaii pot avea mai
multe ferestre, iar tastatura trebuie s fie partajat de toate ferestrele din cadrul aceleiai aplicaii. Atunci cnd este
apsat o tast, o singur fereastr trebuie s primeasc mesajul privind apsarea tastei respective. Fereastra care
primete acest mesaj este fereastra care deine cursorul de intrare" (input focus").

Conceptul cursorului de intrare este strns legat de conceptul de fereastr activ". Fereastra care deine cursorul
de intrare este fie fereastra activ, fie o fereastr descendent a ferestrei active. De obicei, fereastra activ este uor de
identificat. Dac fereastra activ are o bar de titlu, Windows evideniaz bara de titlu a acesteia. Dac fereastra activ
are un cadru de dialog (o form des ntlnit n casetele de dialog) n locul unei bare de titlu, Windows evideniaz acest
cadru. Dac fereastra activ a fost redus la o pictogram (minimizat), Windows evideniaz textul afiat sub
pictogram.

O procedur de fereastr poate s afle cnd are cursorul de intrare prin interceptarea mesajelor WM_SETFOCUS i
WM_KILLFOCUS. Mesajul WM_SETFOCUS indic faptul c fereastra primete cursorul de intrare (input focus), iar
mesajul WM_KILLFOCUS indic faptul c fereastra pierde cursorul de intrare.

Acionri de taste i caractere


Mesajele privind tastatura pe care un program le recepioneaz de la sistemul de operare fac diferena ntre
acionrile de taste" (keystrokes") i caractere". Aceste noiuni sunt legate de cele dou moduri n care putei s
privii tastatura. n primul rnd, tastatura este o colecie de taste. Tastatura are o singur tast A; apsarea tastei A este
o acionare de tast, iar eliberarea tastei A este tot o acionare de tast. Tastatura este, ns, n acelai timp, i un
dispozitiv de intrare care genereaz caractere afiabile. Tasta A poate s genereze mai multe caractere, n funcie de
starea tastelor Ctrl, Shift i Caps Lock. n mod normal, caracterul generat este a. Dac tasta Shift este apsat, sau tasta
Caps Lock este activ, caracterul generat este A. Dac tasta Ctrl este apsat, caracterul generat este Ctrl+A. Dac se
folosete un driver de tastatur pentru o limb strin, apsarea tastei A poate s fie precedat de un caracter mort"
(dead-character key") sau de tastele Shift, Ctrl sau Alt n diferite combinaii. Combinaiile pot s genereze un caracter a
sau A cu un accent.

Pentru acionrile de taste care genereaz caractere afiabile, Windows trimite programului att mesaje pentru
acionarea de taste, ct i mesaje pentru caractere. Unele taste nu genereaz caractere. Astfel de taste sunt Shift,
tastele funcionale, tastele de deplasare i tastele speciale, precum Insert i Delete. n cazul acestor taste, Windows
genereaz numai mesaje pentru acionari de taste.

50. n ce const arhitectura orientat pe mesaje?

Orice fereastr creat de un program are asociat o procedur de fereastr. Procedura de fereastr este e funcie
care se poate afla chiar n program sau ntr-o bibliotec cu legturi dinamice (DLL). Windows trimite un mesaj ctre o
fereastr prin apelarea procedurii de fereastr. Procedura de fereastr prelucreaz anumite informaii pe baza mesajului
primit, apoi returneaz controlul sistemului de operare.

O procedur de fereastr prelucreaz mesajele trimise ferestrei respective. Deseori, aceste mesaje informeaz
fereastra cu privire la aciunile executate de utilizator cu ajutorul mouse-ului sau al tastaturii. Aceasta este calea prin
care o fereastr afl", de exemplu, c un buton a fost apsat. Alte mesaje comunic ferestrei c a fost redimensionat
sau c trebuie s fie refcut.
Atunci cnd un program este lansat n execuie, Windows creeaz o coad de mesaje" (message queue") pentru
programul respectiv, n aceast coad de mesaje sunt pstrate mesajele trimise ctre toate ferestrele pe care le creeaz
programul. Programul conine o mic secven de cod numit ciclu de mesaje" (message loop") care preia mesajele
din coada de ateptare i le distribuie procedurilor de fereastr corespunztoare. Alte mesaje sunt trimise direct
procedurii de fereastr, fr s mai fie plasate n coada de mesaje.

51. n ce const consecvena privind interfaa cu utilizatorul?

Windows este o interfa grafic cu utilizatorul (GUI - graphical user interface), numit uneori i interfa vizual"
sau mediu grafic cu ferestre" (graphical windowing environment"). La nceput, ecranul era folosit numai pentru
afiarea informaiilor pe care utilizatorul le introducea de la tastatur. ntr-o interfa grafic, ecranul devine chiar o
surs pentru celelalte intrri ale utilizatorului. Pe ecran sunt afiate diferite obiecte grafice sub forma pictogramelor i a
unor dispozitive de intrare, precum butoanele i barele de derulare. Folosind tastatura (sau, mai direct, un dispozitiv de
indicare precum mouse-ul) utilizatorul poate s manipuleze direct aceste obiecte de pe ecran. Obiectele grafice pot fi
deplasate, butoanele pot fi apsate i barele de derulare pot fi derulate.

Interaciunea dintre program i utilizator devine mult mai direct. n locul unui ciclu unidirectional al informaiilor de
la tastatur la program i de la program la ecran, utilizatorul interacioneaz direct cu obiectele de pe ecran.

Utilizatorii nu mai sunt dispui s piard prea mult timp pentru a nva cum se folosete calculatorul sau cum s
stpneasc un anumit program. Windows i ajut n acest sens, deoarece toate programele pentru Windows au un
aspect asemntor i se comport fundamental la fel. Programele ocup o fereastr - o suprafa dreptunghiular de pe
ecran. Fereastra poate fi identificat datorit unei bare de titlu. Majoritatea funciilor oferite de program sunt apelate cu
ajutorul unui meniu. Informaiile afiate care nu ncap pe un singur ecran pot fi vizualizate cu ajutorul barelor de
derulare. Unele articole de meniu apeleaz casete de dialog n care utilizatorul introduce informaii suplimentare. n
majoritatea programelor mai mari pentru Windows exist o caset de dialog care deschide un fiier. Aceast caset de
dialog arat la fel (sau foarte asemntor) n mai multe programe Windows i este apelat aproape ntotdeauna cu
aceeai opiune de meniu.

Din punctul de vedere al programatorului, consecvena n realizarea interfeei cu utilizatorul este rezultatul folosirii
procedurilor integrate n Windows pentru construirea meniurilor i a casetelor de dialog. Toate meniurile au aceeai
interfa cu tastatura i cu mouse-ul deoarece aceste operaii sunt manipulate mai degrab de Windows, dect de
programul respectiv.

52. n ce const interfaa grafic independent de dispozitiv?

Windows este o interfa grafic i programele pentru Windows pot folosi toate avantajele oferite de elementele grafice
i de textul formatat att pentru ecran, ct i pentru imprimant. O interfa grafic nu are numai avantajul de a fi mai
atractiv, ci i pe acela de a furniza utilizatorului o cantitate mai mare de informaii.

Programele scrise pentru Windows nu au acces direct la componentele hardware ale dispozitivelor de afiare, cum ar fi
ecranul sau imprimanta. n schimb, Windows folosete un limbaj de programare pentru grafic (numit GDI - Graphics
Device Interface) care simplific afiarea textului formatat i a elementelor grafice. Windows transform componentele
hardware de afiare n dispozitive virtuale. Un program scris pentru Windows va rula cu orice plac video i cu orice
imprimanta pentru care Windows are un driver de dispozitiv. Programul nu trebuie s determine ce tip de dispozitiv fizic
este ataat la calculator.

Crearea unei interfee grafice independente de dispozitiv pentru calculatoarele IBM PC nu a fost o sarcin uoar pentru
dezvoltatorii sistemului de operare Windows. Proiectarea calculatoarelor personale s-a fcut pe baza principiului
arhitecturilor deschise. Productorii teri de componente hardware au fost ncurajai s dezvolte dispozitive periferice, i
datorit acestui fapt au aprut o mulime de astfel de dispozitive. Dei au fost create anumite standarde, programele
convenionale pentru MS-DOS trebuie s asigure suportul individual pentru diferite configuraii standard. De exemplu,
este un lucru destul de obinuit ca un program de procesare de texte pentru MS-DOS s fie livrat mpreun cu cteva
dischete care conin mai multe fiiere mici, pentru adaptarea la diferite tipuri de imprimante. Programele Windows 95
nu au nevoie de drivere proprii, deoarece acestea sunt asigurate chiar de sistemul de operare.

53. Interfaa pentru dispozitive grafice. Filozofia GDI. Structura interfeei GDI. Tipuri de apeluri de
funcii. Primitive GDI.

Interfaa pentru dispozitive grafice (GDI - Graphics Device Interface) este o component a sistemului de operare
Windows 95 i are ca sarcin afiarea elementelor grafice (inclusiv a textului) pe ecran i la imprimant. GDI este, n
general, un sistem de afiare static, ce permite numai animaii limitate. Aa cum este implementat n Windows 95,
interfa GDI nu asigur un suport direct pentru afiarea tridimensional sau pentru rotirea obiectelor.

Din punctul de vedere al programatorului, interfaa GDI este format din cteva sute de apeluri de funcii i unele tipuri
de date, macroinstruciuni i structuri asociate acestor funcii

Filozofia GDI
n versiunile pe 32 de bii ale sistemului de operare Windows elementele grafice sunt manipulate, n principal, prin
funcii exportate din biblioteca cu legturi dinamice GDI32.DLL, care, la rndul ei, folosete biblioteca cu legturi
dinamice pe 16 bii GDI.EXE. Aceste module apeleaz proceduri din diferite fiiere driver pentru afiare - un fiier .DRV
pentru afiarea pe ecran i, probabil, unul sau mai multe fiiere .DRV care controleaz imprimantele i plotterele.
Driverele execut operaiile de acces la componentele hardware ale monitorului video sau convertesc comenzile GDI n
coduri sau comenzi pe care le pot interpreta diferite tipuri de imprimante. Pentru diferite tipuri de plci video sau de
imprimante este nevoie, desigur, de diferite fiiere driver.

Deoarece la calculatoarele compatibile PC pot fi ataate diferite dispozitive de afiare, unul dintre scopurile
principale ale interfeei GDI este s permit manipularea elementelor grafice independent de dispozitiv. Programele
scrise pentru Windows ar trebui s ruleze fr probleme, indiferent de dispozitivul grafic de afiare folosit, dac acesta
este acceptat de sistemul de operare. Interfaa GDI realizeaz acest lucru prin furnizarea unor componente care izoleaz
programele de caracteristicile particulare ale diferitelor dispozitive de ieire.

Tipuri de apeluri de funcii


n general, apelurile de funcii GDI pot fi clasificate n mai multe categorii. Chiar dac nu sunt foarte stricte i exist unele
suprapuneri, aceste categorii pot fi enunate astfel:
- Funcii care obin (sau creeaz) i elibereaz (sau distrug) un context de dispozitiv. . Funciile GetDC i
ReleaseDC v permit s facei aceste lucruri n timpul prelucrrii altor mesaje dect WM_PAINT, pe
cnd funciile BeginPaint i EndPaint (dei din punct de vedere tehnic fac parte din subsistemul USER
din Windows) sunt folosite n timpul prelucrrii mesajului WM_PAINT.
- Funcii care obin informaii despre contextul de dispozitiv.
- Funcii care deseneaz ceva.
- Funcii care stabilesc sau obin atribute ale contextului de dispozitiv. Un atribut" al contextului de
dispozitiv specific modul de lucru al funciilor de desenare. De exemplu, folosii funcia SetTextColor
ca s precizai culoarea textului afiat cu funcia TextOut (sau cu o alt funcie de afiare a textului).
- Funcii care lucreaz cu obiecte GDI.
Primitive GDI

Elementele grafice pe care le afiai pe ecran sau le tiprii la imprimant pot fi mprite n mai multe categorii, numite
primitive". Iat care sunt aceste categorii:

- Linii i curbe. Liniile reprezint baza oricrui sistem de desenare vectorial. GDI permite folosirea liniilor
drepte, a dreptunghiurilor, a elipselor (inclusiv subsetul de elipse cunoscute sub numele de cercuri), a
arcelor - care sunt curbe reprezentnd poriuni din circumferina unei elipse sau a curbelor Bezier
- Suprafee pline. Dac o serie de linii sau de curbe nchid o suprafa, aceasta poate fi umplut" folosind
pensula GDI curent. Aceast pensul poate fi o culoare compact, un model (hauri orizontale,
verticale sau pe diagonal) sau o imagine bitmap repetat pe vertical sau pe orizontal.
- Imagini bitmap. Imaginile bitmap sunt matrice dreptunghiulare de bii, care corespund pixelilor unui
dispozitiv de afiare. Imaginile bitmap sunt instrumente de baz pentru sistemele grafice de tip rastru. n
general, acestea sunt folosite pentru afiarea imaginilor complexe (deseori preluate din lumea real) pe
ecran sau pentru tiprirea acestora la imprimant. De asemenea, imaginile bitmap sunt folosite pentru
afiarea unor mici imagini (cum ar fi pictograme, indicatoare de mouse i butoane de pe barele cu
instrumente de lucru ale aplicaiilor) care trebuie afiate foarte rapid.
- Text. Textul este mai puin matematic" dect alte aspecte ale graficii pe calculator. Textul, aa cum l
tim, este legat de sute de ani de tipografia tradiional, apreciat adesea ca adevrat art. Din acest
motiv, textul este de multe ori nu doar cea mai complex parte a sistemului grafic, ci i cea mai
important. Structurile create pentru definirea fonturilor i pentru obinerea informaiilor despre fonturi
sunt printre cele mai mari din Windows. ncepnd cu versiunea Windows 3.1, interfaa GDI accept
fonturile TrueType, bazate pe contururi umplute, care pot fi manipulate de alte funcii GDI.

54. Mesaje CARACTER. Mesajul WM_CHAR. Mesaje pentru caractere moarte".

. Exist patru mesaje caracter:

Caractere moarte"
Caractere
Caractere non-sistem WM_CHAR WM_DEADCHAR
Caractere sistem WM_SYSCHAR WM_SYSDEADCHAR

Mesajul WM_CHAR
Atunci cnd trebuie s prelucreze caracterele introduse de la tastatur (de exemplu, ntr-un procesor de texte sau ntr-
un program de comunicaii) programul prelucreaz mesajele WM_CHAR.

.Dac utilizatorul apas o liter (de exemplu, tasta A), procedura de fereastr primete un mesaj WM_CHAR pentru care
parametrul wParam conine codul ASCII al literei a" cu semnul diacritic respectiv.

Mesaje pentru caractere moarte"


De obicei, programele pot s ignore mesajele WM_DEADCHAR si WM_SYSDEADCHAR. Pe unele tastaturi, n afar de
tastatura de tip american, o serie de taste sunt folosite pentru adugarea semnelor diacritice la o liter. Acestea se
numesc taste moarte" (dead keys") deoarece nu pot crea singure caractere. De exemplu, pe o tastatura german, n
locul tastei +/= de pe tastatura american se afl o tast moart pentru accentul ascuit ('') dac nu este apsat tasta
Shift, si pentru accentul grav (`) dac este apsat tasta Shift.
Atunci cnd utilizatorul apas aceast tast moart, procedura de fereastr primete un mesaj WM_DEADCHAR
pentru care parametrul wParam conine codul ASCII al semnului diacritic. Dac utilizatorul apas apoi o liter (de
exemplu, tasta A), procedura de fereastr primete un mesaj WM_CHAR pentru care parametrul wParam conine codul
ASCII al literei a" cu semnul diacritic respectiv. Ca urmare, programul nu trebuie s prelucreze mesajul
WM_DEADCHAR, deoarece mesajul WM_CHAR urmtor i furnizeaz toate informaiile necesare. Codul Windows se
ocup chiar i de tratarea erorilor: dac tasta moart este urmat de o liter care nu poate avea semnul diacritic
respectiv (cum ar fi litera s"), procedura de fereastr primete dou mesaje WM_CHAR - pentru primul parametrul
wParam conine codul ASCII al semnului diacritic, iar pentru al doilea parametrul wParam conine codul ASCII al literei
s".

55. Mesaje de la barele de derulare. Structurarea programului pentru desenare. ScrollWindow

Barele de derulare se numr printre cele mai reuite componente ale unei interfee grafice pentru mouse; sunt
uor de folosit i determin o reacie vizual foarte rapid. Barele de derulare sunt poziionate vertical (pentru deplasri
n sus i n jos) sau orizontal (pentru deplasri la stnga i la dreapta).

Windows trimite procedurii de fereastr mesajul WM_VSCROLL sau mesajul WM_HSCROLL atunci cnd utilizatorul
execut clic pe bara de derulare sau trage caseta de derulare cu ajutorul mouse-ului. Fiecare aciune cu mouse-ul asupra
barei de derulare genereaz cel puin dou mesaje - unul la apsarea butonului i al doilea la eliberarea acestuia.

Procedura de fereastr poate s primeasc mai multe mesaje SB_LINEUP, SB_PAGEUP, SB_PAGEDOWN,
SB_LINEDOWN dac butonul mouse-ului este inut apsat n timp ce indicatorul lui este poziionat pe bara de derulare.
Mesajul SB_ENDSCROLL semnaleaz eliberarea butonului mouse-ului. n general putei ignora mesajele SB_ENDSCROLL.

Atunci cnd cuvntul mai puin semnificativ al parametrului wParam are una dintre valorile SB_THUMBTRACK sau
SB_THUMBPOSITION, cuvntul mai semnificativ al parametrului wParam conine poziia curent pe bara de derulare.
Aceast poziie se ncadreaz n domeniul barei de derulare.

Structurarea programului pentru desenare

Cel mai bine este s structurai programul astfel nct toate operaiile de desenare n zona client s se fac n timpul
prelucrrii mesajelor WM_PAINT. Deoarece programul trebuie s aib posibilitatea de redesenare a ntregii zone client
n momentul primirii unui mesaj WM_PAINT, probabil vei duplica unele secvene de cod dac vei face tiprirea i n
alte puncte din program.

n unele aplicaii s-ar putea s nu fie suficient simpla transmitere a unor mesaje WM_PAINT prin marcarea unor
poriuni din fereastr ca invalide. Dup ce apelai funcia InvalidateRect, Windows plaseaz n coada de ateptare un
mesaj WM_PAINT, iar procedura de fereastr va prelucra la un moment dat acest mesaj. Totui, Windows trateaz
mesajele WM_PAINT ca mesaje de prioritate sczut i, dac n sistem activitatea este intens, poate s treac un timp
destul de lung pan la prelucrarea acestora. Toat lumea a vzut guri" albe n ferestre dup nchiderea unor casete de
dialog.

Dac dorii ca actualizarea poriunii invalide s se fac imediat, dup funcia InvalidateRect apelai imediat funcia
UpdateWindow:

UpdateWindow (hwnd) ;

Funcia UpdateWindow determin sistemul de operare s apeleze procedura de fereastr cu un mesaj WM_PAINT dac vreo
poriune a zonei client este invalid. (Dac ntreaga zon client este valid, procedura de fereastr nu mai este apelat.) Acest mesaj
WM_PAINT sare peste coada de ateptare, procedura de fereastr fiind apelat direct de Windows. Dup ce procedura de fereastr
ncheie operaia de redesenare, sistemul de operare cedeaz din nou controlul programului i execuia continu de la instruciunea de
dup apelul funciei UpdateWindow.

ScrollWindow

Funcia Windows ScrollWindow este folosit pentru derularea coninutului ferestrei. Aceast funcie are urmtorul
format:
ScrollWindow (hwnd, xInc, yInc, pRect, pClipRect) ;

Valorile xlnc i ylnc specific numrul de pixeli cu care se face derularea. Daca parametrii pRect i pClipRect au
valoarea NULL, atunci se specifica faptul c trebuie derulat ntreaga zon client. Windows invalideaz dreptunghiul
din zona client descoperit" de operaia de derulare. Aceasta genereaz un mesaj WM_PAINT. Nu este necesar
apelarea funciei InvalidateRect. (Reinei c funcia ScrollWindow nu este o procedur GDI, deoarece nu are nevoie
de o variabil handle. ScrollWindow este una dintre puinele funcii non-GDI din Windows care modific aspectul
zonei client a ferestrei.)

56. Mesaje generate de mouse n afara zonei client. Mesajul de testare a poziiei. Mesajele genereaz
mesaje.

Mesajele generate de mouse n afara zonei client corespund mesajelor din zona client, dar includ caracterele NC"
(de la non-client"). Dac mouse-ul este deplasat n afara zonei client a unei ferestre, procedura de fereastr primete
urmtoarele mesaje:

Buton Eliberat Apsat (al doilea clic)


Apsat
Stnga WM_NCLBUTTON DOWN WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK

Mijloc WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK

Dreapta WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_NCRBUTTONDBLCLK

Totui, parametrii wParam i lParam pentru mesajele generate de mouse din afara zonei client sunt diferite de cele
generate din zona client. Parametrul wParam indic zona non-client din care a fost generat mesajul. Parametrul wParam
poate conine unul dintre identificatorii cu prefixul HT (hit test") definii n fiierele antet din Windows.
Variabila lParam conine coordonata pe axa x n cuvntul mai puin semnificativ i coordonata pe axa y n cuvntul
mai semnificativ. Totui, aceste coordonate sunt relative la ecran, nu la zona client. Pentru coordonatele de ecran,
punctul de origine (0,0) este colul din stnga-sus al zonei de afiare a ecranului. Valorile coordonatei x cresc ctre
dreapta, iar valorile coordonatei y cresc n jos

Mesajul de testare a poziiei

Mesajul WM_NCHITTEST (non client hit test") este folosit pentru verificarea poziiei din care a fost generat mesajul.
Acest mesaj precede toate celelalte mesaje generate de mouse, din zona client sau din afara acesteia. Parametrul
IParam al mesajului conine coordonatele x i y ale indicatorului de mouse. Parametrul wParam nu este folosit.
De obicei, aplicaiile Windows transmit acest mesaj funciei DefWindowProc. Windows folosete mesajul
WM_NCHITTEST ca s genereze celelalte mesaje, n funcie de poziia mouse-ului. Pentru mesajele din afara zonei client,
valoarea returnat de funcia DefWindowProc n urma prelucrrii mesajului WM_NCHITTEST devine parametrul wParam
al mesajului generat. Aceast valoare poate fi oricare dintre valorile wParam care nsoesc mesajele generate de mouse
din afara zonei client, plus urmtoarele:
HTCLIENT Zona client

HTNOWHERE Nici o fereastr

HTTRANSPARENT O fereastr acoperit de o alt fereastr

HTERROR Determin funcia DefWindowProc s emit un semnal sonor


Dac funcia DefWindowProc genereaz un mesaj HTCLIENT n urma prelucrrii mesajului WM_NCHITTEST, Windows
transform coordonatele ecran n coordonate ale zonei client i genereaz un mesaj pentru zona client.
Mesajele genereaz mesaje

Windows folosete mesajul WM_NCHITTEST ca s genereze alte mesaje de mouse. Ideea mesajelor care genereaz
alte mesaje este des ntlnit n Windows. Dup cum tii, dac executai dublu clic pe pictograma meniului sistem a
unui program Windows, execuia acestuia se ncheie. Executarea unui dublu clic genereaz o serie de mesaje
WM_NCHITTEST. Deoarece indicatorul mouse-ului se afl deasupra pictogramei meniului sistem, funcia
DefWindowProc returneaz valoarea HTSYSMENU i Windows insereaz n coada de ateptare a programului un mesaj
WM_NCLBUTTONDBLCLK care conine n parametrul wParam valoarea HTSYSMENU.
De obicei, procedura de fereastr retransmite acest mesaj funciei DefWindowProc. Atunci cnd recepioneaz
mesajul cu parametrul wParam egal cu HTSYSMENU, funcia DefWindowProc insereaz n coada de ateptare un mesaj
WM_SYSCOMMAND cu parametrul wParam egal cu SC_CLOSE. (Acest mesaj WM_SYSCOMMAND este generat i atunci
cnd utilizatorul selecteaz opiunea Close din meniul sistem.) Din nou, procedura de fereastr transmite acest mesaj
funciei DefWmdowProc. Funcia DefWindowProc l prelucreaz trimind procedurii de fereastr mesajul WM_CLOSE.
Dac dorii ca programul s cear confirmarea utilizatorului nainte de terminare, procedura de fereastr trebuie
sunt intercepteze mesajul WM_CLOSE. n caz contrar, funcia DefWmdowProc prelucreaz mesajul WM_CLOSE apelnd
funcia DestroyWindow. Printre alte aciuni, funcia DestroyWindow trimite procedurii de fereastr un mesaj
WM_DESTROY. n mod normal, procedura de fereastr prelucreaz mesajul WM.DESTROY astfel:
case WM_DESTROY :

PostQuitMessage (0) ;

return 0 ;

Funcia PostQuitMessage determin sistemul de operare s insereze n coada de mesaje un mesaj WM_QUIT. Acest
mesaj nu ajunge niciodat la procedura de fereastr, deoarece determin funcia GetMessage s returneze valoarea 0,
care ncheie ciclul de tratare a mesajelor.

57. MESAJE GENERATE DE MOUSE N ZONA CLIENT Mesaje non-client. Mtile MK_LBUTTON,
MK_MBUTTON, MK_RBUTTON, MK_SHIFT, MK_CONTROL.
Mesaje zona-client> Atunci cnd mouse-ul este deplasat peste zona client a unei ferestre, procedura de fereastr
primete mesajul WM_MOUSEMOVE. Dac un buton al mouse-ului este apsat sau eliberat n zona client a unei
ferestre, procedura de fereastr primete un sir de mesaje ca: WM_LBUTTONDOWN WM_LBUTTONUP
WM_LBUTTONDBLCLK de si de asemenea un sir de mesaje pentru celelate butoane ale soricelului(pentru
butonul din mijloc si cel din dreapta-depinde de tipul mouseului(cu unul doua sau trei butoane, cit si de specificatiile
ferestre ce poate sau nu sa primeasca dublu clik)). , parametrul lParam conine poziia mouse-ului.
Mesaje NC> Dac mouse-ul se afl n afara zonei client, dar se afl nc n fereastr, Windows trimite procedurii de
fereastr un mesaj non-client". Zona non-client" include bara de titlu, meniul i barele de derulare ale ferestrei. n
general nu este nevoie s prelucrai mesajele generate n afara zonei client(DefWindowProc()).Mesajele generate de
mouse n afara zonei client corespund mesajelor din zona client, dar includ caracterele
NC"(WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,WM_NCLBUTTONDBLCLK). Parametrul wParam indic zona non-
client din care a fost generat mesajul. Parametrul wParam poate conine unul dintre identificatorii cu prefixul HT.
Variabila lParam conine coordonata pe axa x n cuvntul mai puin semnificativ i coordonata pe axa y n cuvntul mai
semnificativ(raportate la zona ecran).
Mastiel> Valoarea parametrului wParam indic starea buloanelor mouse-ului i starea tastelor Shift i Ctrl. Putei s
testai parametrul wParam folosind o serie de mti definite n fiierele antet din Windows.
MK_LBUTTON Butonul din stnga al mouse-ului este apsat
MK_MBUTTON Butonul din mijloc al mouse-ului este apsat
MK_RBUTTON Butonul din dreapta al mouse-ului este apsat
MK_SHIFT Tasta Shift este apsat
MK_CONTROL Tasta Ctrl este apsat

58. Mesajele de la o fereastr child la una printe.


Mesajele de la o fereastra copil la una parinte pot fi observate foarte bine pe baza unei ferestre de tip button ce este
copilul unei ferestre parinte.Atunci cnd executai clic pe un buton, controlul de tip fereastr descendent trimite mesajul
WM_COMMAND ctre fereastra printe. Programul intercepteaz mesajul WM_COMMAND cu valorile lParam i
wParam. Iat ce semnificaie au acestea:
LOWORD (wParam) Identificatorul ferestrei descendent
HIWORD (wParam) Codul de ntiinare
lParam Variabila handle a ferestrei descendent
Dac facei conversia unor programe scrise pentru versiunile pe 16 bii ale sistemului de operare Windows, reinei c
aceti parametri au fost modificai n vederea adaptrii la dimensiunea pointerilor pe 32 de bii.
Codul de ntiinare este un cod de submesaj pe care fereastra descendent l folosete pentru a transmite ferestrei
printe mai multe informaii despre semnificaia mesajului. Valorile pe care le pot avea aceste coduri sunt definite n
fiierele antet definite n Windows:BN_CLICKED;BN_PAINT;BN_HILITE;BN_UNHILITE;BN_DISABLE;BN_DOUBLECLICKED;

59. Mesajele de la timer.


Programul nostru avind un timer setat v-a primi la fiecare interval de timp specificat un singur mesaj , si anume
WM_TIMER, insa este important de tinut cont ca ceasul foloseste tactul de sitem sau mai bine spus intreruperile de
sistem ce au unele restrictii, ntreruperi sunt generate la fiecare 54,925 milisecunde, adic de 18,2 ori pe secund.
Intervalul de timp pe care l specificai la apelarea funciei SetTimer este rotunjit la un multiplu ntreg de tacturi de ceas.
De exemplu, prin mprirea intervalului de 1000 de milisecunde la 54,925 rezult 18,207, valoare care este rotunjit la
18 tacturi de ceas, ceea ce nseamn, de fapt, un interval de 989 milisecunde.Insa intreruperile de ceas caatare nu pot fi
condsiderate ca fiind asincrone, insa mesajele WM_TIMER au o prioritate joasa, fiind in principiu foarte asemanatoare
cu mesajele WM_PAINT.
60. Mesajele privind tastatura: acionri de taste i caractere". Taste obinuite i taste de sistem.
WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP. Variabila lParam.
Actionari de taste si caractere> Mesajele privind tastatura pe care un program le recepioneaz de la sistemul de
operare fac diferena ntre acionrile de taste" (keystrokes") i caractere". Aceste noiuni sunt legate de cele dou
moduri n care putei s privii tastatura. n primul rnd, tastatura este o colecie de taste. Tastatura are o singur tast
A; apsarea tastei A este o acionare de tast, iar eliberarea tastei A este tot o acionare de tast. Tastatura este, ns, n
acelai timp, i un dispozitiv de intrare care genereaz caractere afiabile. Tasta A poate s genereze mai multe
caractere, n funcie de starea tastelor Ctrl, Shift i Caps Lock. n mod normal, caracterul generat este a. Dac tasta Shift
este apsat, sau tasta Caps Lock este activ, caracterul generat este A. Dac tasta Ctrl este apsat, caracterul generat
este Ctrl+A. Dac se folosete un driver de tastatur pentru o limb strin, apsarea tastei A poate s fie precedat de
un caracter mort" (dead-character key") sau de tastele Shift, Ctrl sau Alt n diferite combinaii. Combinaiile pot s
genereze un caracter a sau A cu un accent.
Pentru acionrile de taste care genereaz caractere afiabile, Windows trimite programului att mesaje pentru
acionarea de taste, ct i mesaje pentru caractere. Unele taste nu genereaz caractere. Astfel de taste sunt Shift,
tastele funcionale, tastele de deplasare i tastele speciale, precum Insert i Delete. n cazul acestor taste, Windows
genereaz numai mesaje pentru acionari de taste.
Taste obisnuite si taste de sistem> Mesajele WM_SYSKEYDOWN i WM_SYSKEYUP sunt generate, de obicei, pentru
taste apsate n combinaie cu tasta Alt. Aceste acionari de taste apeleaz opiuni din meniul programului ori din
meniul sistem, sunt folosite pentru funcii ale sistemului, cum ar fi comutarea ferestrei active (Alt+Tab sau Alt+Esc) sau
sunt folosite pentru acceleratori de meniu (Alt n combinaie cu o tast funcional). De obicei, programul ignor
mesajele WM_SYSKEYDOWN i WM_SYSKEYUP i le retransmite funciei DefWindowProc. Deoarece Windows
manipuleaz combinaiile Alt+tast, nu este nevoie s interceptai aceste mesaje. WM_KEYDOWN i WM_KEYUP sunt
caracteristice deja pentru tastele obisnuite.
Variabila lParam> Pentru toate mesajele legate de acionrile de taste variabila lParam (pe 32 de bii) transmis
procedurii de fereastr este mprit n ase cmpuri: contorul de repetare(specific numrul de acionari de taste
reprezentat de un mesaj. n majoritatea cazurilor, contorul de repetare are valoarea 1), codul de scanare OEM(codul de
scanare al tastaturii, generat de componentele hardware deobicei ignorat, indicatorul flag pentru taste extinse are
valoarea 1 dac mesajul este generat de una dintre tastele suplimentare de pe tastatura IBM extins.), codul de
context(are valoarea 1 dac este apsat tasta Alt), starea anterioar a tastei(are valoarea 0 dac tasta nu a fost
anterior apsat, i valoarea 1 dac tasta a fost apsat) i starea de tranziie(are valoarea 0 dac tasta este apsat i
valoarea 1 dac tasta este eliberat).

61. Mesajele WM_CREATE, WM_PAINT i WM_DESTROY.


WM_CREATE> Atunci cnd din main se apeleaz funcia CreateWindow, Windows face ce are de fcut i apeleaz
funcia WndProc, transmindu-i variabila handle a ferestrei i mesajul WM_CREATE. WndProc prelucreaz mesajul
WM_CREATE i returneaz controlul sistemului de operare.De cele mai dese ori WM_CREATE ce este practic primul
mesaj primit de procedura de fereastra este folosit pentru a initializa unele valori sau variabile necesare in viitorul
imediat al timpului de executie.
WM_PAINT> Acest mesaj este foarte important n programarea sub Windows, deoarece informeaz fereastra privind
faptul c o parte sau ntreaga zon client a acesteia este invalid" i trebuie s fie redesenat. Aproape ntotdeauna,
prelucrarea mesajului WM_PAINT ncepe prin apelarea funciei BeginPaint i se termin cu apelarea funciei EndPaint cu
parametrii (hwnd, &ps),ps- PAINTSTRUCT conine unele informaii pe care programul le poate folosi pentru redesenarea
zonei client.
WM_DESTROY> Un alt mesaj important este WM_DESTROY. Acest mesaj indic faptul c sistemul de operare
desfoar un proces de distrugere a ferestrei pe baza unei comenzi de la utilizator. Mesajul este trimis atunci cnd
utilizatorul execut clic pe butonul Close, selecteaz opiunea Close din meniul sistem sau apas fastele Alt+F4.
Programul HELLOWIN rspunde la acest mesaj printr-o metod standard, apelnd funcia PostQuitMessage (0) ;
Aceast funcie insereaz n coada de ateptare a programului un mesaj WM_QUIT. Am spus anterior c funcia
GetMessage returneaz o valoare diferit de zero n cazul prelurii oricrui mesaj n afar de WM_QUIT. Atunci cnd
preia din coada de ateptare un mesaj WM_QUIT, funcia GetMessage returneaz valoarea 0, ceea ce determin ieirea
din ciclul de tratare a mesajelor din funcia WinMain i nchiderea programului.

62. Mesajul WM_PAINT. Dreptunghiuri valide i invalide.


WM_PAINT> Acest mesaj este foarte important n programarea sub Windows, deoarece informeaz fereastra privind
faptul c o parte sau ntreaga zon client a acesteia este invalid" i trebuie s fie redesenat. Aproape ntotdeauna,
prelucrarea mesajului WM_PAINT ncepe prin apelarea funciei BeginPaint i se termin cu apelarea funciei EndPaint cu
parametrii (hwnd, &ps),ps- PAINTSTRUCT conine unele informaii pe care programul le poate folosi pentru redesenarea
zonei client(inclusiv o structura de tip RECT ce inlcude dreptunghoil invalid).Cel mai important la mesajul WM_PAINT
este faptul ca el permite desenarea doar in zona invalida ce nu este altceva decit o regiune a zonei client ce a fost
acoperita de un meniu popup sau a fost suprapusa de o alta fereastra .. mutata in afara zonei ecran etc si spre final
valideaza zona in cauza.Desenarea fortata se poate efectua apelind funtia InvalidateRect(hwnd,lpRect,bErase); ce
invalideaza o zona si respectiv asugura desenarea in cadrul zonei date(daca pentru lpRect includem valoarea NULL
intreaga zona client va fi redesenata).

63. Modificarea textului unui buton.


Putei s modificai textul unui buton (sau al unei alte ferestre) prin apelarea funciei SetWindowText:
SetWindowText (hwnd, pszString) ;
unde hwnd este variabila handle a ferestrei al crei text urmeaz s fie nlocuit, iar pszString este un pointer la un ir de
caractere terminat cu caracterul nul. Pentru o fereastr normal, acesta este textul care va fi afiat n bara de titlu.
Pentru un buton, acesta este textul afiat pe buton.
De asemenea, putei s obinei textul ferestrei curente:
iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;
Parametrul iMaxLength specific numrul maxim de caractere care va fi copiat n bufferul adresat de pointerul
pszBuffer. Funcia returneaz lungimea irului de caractere copiat. Putei s pregtii programul pentru un text de o
anumit lungime apelnd mai nti funcia GetWindowTextLength:
iLength = GetWindowTextLength (hwnd) ;

64. Moduri de desenare. Operaii rastru (ROP - raster operation). Funciile SetROP2, iDrawMode,
GetROP2.

Imaginai-v o cale prin care s putei folosi aceeai peni ca s desenai o linie alb pe fond negru, dar i o linie neagr
pe fond alb, tiind ce culoare are fondul. Dac v este util aceast facilitate, putei s o obinei prin schimbarea
modului de desenare. Atunci cnd folosete o peni pentru desenarea unei linii, Windows face de fapt o operaie
boolean ntre pixelii peniei i pixelii de pe suprafaa destinaie. Efectuarea operaiei booleene ntre pixeli se numete
operaie rastru"(ROP). Deoarece desenarea unei linii implic numai dou modele de pixeli (penia i destinaia),
operaia boolean se numete operaie rastru binar" sau ROP2. Windows definete 16 coduri ROP2 care specific
modul de combinare ntre pixelii peniei i pixelii suprafeei, n contextul de dispozitiv prestabilit, modul de desenare
definit este R2_COPYPEN, ceea ce nseamn c Windows copiaz pixelii peniei pe suprafaa destinaie - adic modul
normal n care suntem obinuii s funcioneze o peni. Exist alte 15 coduri ROP2.
Putei s selectai un nou mod de desenare n contextul de dispozitiv astfel:
SetROP2 (hdc, iDrawMode) ;
unde parametrul iDrawMode este una dintre valorile din coloana Mod de desenare" a tabelului ce contine toate
modurile de desenare.Putei s obinei modul curent de desenare astfel:
iDrawMode = GetROP2 (hdc) ;
Exemple de moduri de desenare : Modul R2_NOTCOPYPEN deseneaz cu alb dac penia este neagr i cu negru dac
penia este alb. Modul R2_BLACK deseneaz ntotdeauna cu negru, indiferent de culoarea peniei i a destinaiei. n
mod similar, modul R2_WHITE deseneaz ntotdeauna cu alb. Modul R2_NOP este o operaie nul" - destinaia rmne
nemodificat.

65. Modurile de mapare metrice". Moduri de mapare proprii. Modul de mapare MM_ISOTROPIC.
Modul de mapare MM_ANISOTROPIC sau ajustarea imaginii.

Moduri de mapare metrice> Windows include dou moduri de mapare n care coordonatele logice sunt exprimate n
uniti fizice. Deoarece coordonatele logice pe axele x i y sunt mapate la uniti fizice identice, aceste moduri de
mapare v ajut s desenai cercuri mai rotunde" i ptrate mai ptrate".

Extensiile ferestrei i ale vizorului depind de modul de mapare i de raportul de afiare a dispozitivului. Aa cum am
menionat anterior, extensiile nu sunt impor tante ca atare, avnd o semnificaie numai exprimate ca
rapoarte.Importanta este trecerea la noile senduri de crestere a axelor de coordonate , la axa y ea fiind inversa celei
obisnuite la MM_TEXT, pentru facilitate putem muta originea sistemului in centrul ferestrei : SetViewportOrgEx (hdc,
cxClient/2, cyClient/2, NULL) ; daca ar fi sa mutam originea ferestrei am fi nevoiti sa transformam puctele fizice in cele
logice pentru a fi transmise functiei SetWindowOrgEx (hdc, -pt.x/2, -pt.y/2, NULL) ;
Moduri de mapare proprii> Acestea sunt singurele moduri de mapare care v permit s modificai extensiile ferestrei i
ale vizorului, ceea ce nseamn c v permit s modificai factorul de scalare pe care Windows l folosete pentru
convertirea coordonatelor logice i a coordonatelor de dispozitiv.
MM_ISOTROPIC> Modul de mapare MM_ISOTROPIC este ideal pentru folosirea unor axe arbitrare, cu uniti logice
egale pe cele dou axe. Dreptunghiurile cu limi i nlimi logice egale sunt afiate ca ptrate. Elipsele cu limi i
nlimi logice egale sunt afiate ca cercuri.Putei s folosii un sistem de coordonate cartezian cu patru cadrane avnd
axe arbitrar scalate n cele patru direcii i cu punctul de coordonate (0, 0) n centrul zonei client. Dac, de exemplu, vrei
ca fiecare ax s ia valori de la 0 la 1000, folosii codul urmtor:
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL);
SetViewportExtEx (hdc, cxClient/2, -cyClient/2, NULL) ;
SetViewportOrgEx (hdc, cxClient/2, cyCllent/2, NULL) ;
Important este faptul ca imaginea va ramine neschimbata chiar daca fereastra e mai mult lata decit inaltasi invers.
MM_ANISOTROPIC> Atunci cnd stabilii extensiile ferestrei i pe ale vizorului n modul de mapare MM_ISOTROPIC,
Windows ajusteaz valorile astfel nct unitile logice de pe cele dou axe s aib aceleai dimensiuni. n modul de
mapare MM_ANISOTROPIC, Windows nu face nici o ajustare a valorilor pe care le stabilii. Aceasta nseamn c n modul
de mapare MM_ANISOTROPIC nu este obligatorie pstrarea raportului corect de afiare.
Pentru a folosi modul de mapare MM_ANISOTROPIC, stabilii un sistem arbitrar de coordonate pentru zona client, ca i
pentru modul de mapare MM_ISOTROPIC. Codul de mai jos stabilete punctul de coordonate (0, 0) n colul din stnga-
jos al zonei client, iar axele de coordonate x i y pot lua valori de la 0 la 32.767:
SetMapMode (hdc, MM_ANISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;

66. Modurile de mapare. Coordonate de dispozitiv i coordonate logice. Sistemele de coordonate ale
dispozitivului. Vizorul i fereastra. Folosirea modului de mapare MM_TEXT.
Modul de mapare> este un atribut al contextului de dispozitiv ce afecteaza aproape orice operatie de desnenare.De
exemplu in funcia TextOut i, de fapt, n toate funciile GDI, coordonatele sunt furnizate n uniti logice". Windows
trebuie s transforme unitile logice" n uniti de dispozitiv", adic n pixeli. Aceast transformare este guvernat de
modul de mapare, de originile ferestrei, ale vizorului i de extensiile ferestrei i ale vizorului. De asemenea, modul de
mapare stabilete i orientarea axelor x i y, adic determin sensul n care cresc valorile coordonatelor x i y. Putei s
selectai modul de mapare folosind funcia SetMapMode:
SetMapMode (hdc, iMapHode) ;
unde iMapMode este unul dintre cei opt identificatori definii pentru modurile de mapare. Putei s obinei modul de
mapare curent folosind funcia GefMapMode:
iMapMode = GetMapMode (hdc) ;
Coordonatele de dispozitiv si cele logice> sunt un element important ce trebuie inteles.Cele fizice sunt coordonatele
dipozitivului fizic(adica pixelii) pe cind cele logice sunt dependete de modul de mapare.Insa cind se folosesc fiecare tip
de coordonate. Windows va folosi n continuare coordonatele de dispozitiv pentru toate mesajele (cum ar fi WM_SIZE,
WM_MOVE i WM_MOUSEMOVE), pentru toate funciile care nu fac parte din interfaa GDI i chiar pentru unele funcii
GDI. GetSystemMetrics nu este o funcie GDI, aa c va returna n continuare dimensiunile n uniti de dispozitiv, adic
n pixeli. . Dac modul de mapare este MM_LOENGLISH n momentul apelrii funciei, GetTextMetrics returneaz
limea i nlimea caracterelor, n sutimi de inci.
Sistemele de coordonate ale dispozitivului> Dei n general am lucrat doar n zona client a ferestrei, n anumite situaii
Windows folosete alte dou sisteme de coordonate de dispozitiv. n toate sistemele de coordonate de dispozitiv sunt
folosii pixelii ca unitate de msur. Valorile de pe axa orizontal (x) cresc de la stnga la dreapta iar valorile de pe axa
vertical (y) cresc de sus n jos. Atunci cnd folosim ntregul ecran, spunem c lucrm n coordonate ecran". Colul din
stnga-sus este punctul de coordonate (0, 0). Dac folosii funcia CreateDC cu parametrul DISPLAY ca s obinei un
context de dispozitiv pentru ntregul ecran, atunci coordonatele logice specificate la apelarea funciilor GDI vor fi mapate
la coordonatele ecranului. Coordonatele de fereastr" se refer la ntreaga fereastr a ecranului, inclusiv bara de titlu,
meniu, barele de derulare i chenarul ferestrei. Pentru o fereastr normal, punctul (0, 0) este colul din stnga-sus al
chenarului de redimensionare. Al treilea sistem de coordonate de dispozitiv - cu care vom lucra cel mai des -folosete
coordonatele zonei client". Punctul (0,0) este colul din stnga-sus al zonei client. Putei s transformai coordonatele
zonei client n coordonatele ecranului i invers folosind funciile ClientToScreen i ScreenToClient.
Vizorul i fereastra> Pentru vizor se folosesc coordonatele de dispozitiv (pixeli). De cele mai multe ori, vizorul coincide
cu zona client a ferestrei, dar poate s nsemne i coordonatele ntregii ferestre sau coordonatele ntregului ecran, dac
ai obinut contextul de dispozitiv prin apelarea funciilor GetWindowDC sau CreateDC. Punctul de coordonate (0, 0) este
colul din stnga-sus al zonei client (sau al ferestrei, ori al ecranului). Valorile coordonatei x cresc ctre dreapta, iar
valorile coordonatei y cresc n jos.Pentru fereastr se utilizeaz coordonatele logice, care pot fi,exprimate n pixeli,
milimetri, inci sau orice alt unitate de msur dorii. Coordonatele logice ale ferestrei sunt specificate la apelarea
funciilor GDI.Pentru toate modurile de mapare, Windows transform coordonatele ferestrei (coordonate logice) n
coordonate ale vizorului (coordonate de dispozitiv) folosind dou formule:

Windows poate s transforme i coordonatele vizorului (coordonate de dispozitiv) n coordonate ale ferestrei
(coordonate logice):

DPtoLP (hdc, pPoints, iNumber) ;//Converteste punctele de dispozitiv in logice


LPtoDP (hdc, pPoints, iNumber) ;//Converteste punctele logice in cele de dipozitiv
Folosirea modului de mapare MM_TEXT> Pentru modul de mapare MM_TEXT, originile i extensiile prestabilite sunt
urmtoarele:
Originea ferestrei: (0, 0) Poate fi modificat
Originea vizorului: (0, 0) Poate fi modificat
Extensia ferestrei: (1, 1) Nu poate fi modificat
Extensia vizorului: (1, 1) Nu poate fi modificat
Raportul din extensia ferestrei i extensia vizorului este 1, aa c nu este necesar nici o operaie de scalare pentru
transformarea coordonatelor logice n coordonate de dispozitiv. n general, citim textul de la stnga spre dreapta i de
sus n jos, iar n modul de mapare MM_TEXT, valorile cresc n acelai sens Windows furnizeaz funciile
SetViewportOrgEx i SetWindowOrgEx pentru modificarea originii vizorului i a ferestrei. De exemplu, s presupunem c
zona client are limea cxClient i nlimea cyClient. Dac vrei ca punctul logic de coordonate (0, 0) s se afle n centrul
zonei client, putei s apelai funcia urmtoare:
SetViewportOrgEx (hdc, cxClient/2, cyClient/2, NULL) ;
Totui, modul de mapare MM_TEXT prezint o mic problem: de obicei, ntr-un sistem de coordonate cartezian,
valorile de pe axa y cresc n sus, pe cnd n modul de mapare MM_TEXT acestea cresc n jos. In acest sens, modul de
mapare MM_TEXT este un caz izolat, aceast problem fiind corectat de celelalte cinci moduri de mapare.
67. Obinerea informaiilor despre culori. PLANES, BITSPIXEL, NUMCOLORS: Tipul COLORREF.

Funcia GetDeviceCaps v permite s determinai modul de organizare a memoriei n adaptoarele video i numrul de
culori care pot fi reprezentate. Apelul de mai jos returneaz numrul de planuri de culoare:
iPlanes = GetDeviceCaps (hdc, PLANES);
Apelul urmtor returneaz numrul de bii de culoare folosii pentru fiecare pixel:
iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL)
Majoritatea adaptoarelor video care pot afia culori folosesc fie mai multe planuri de culoare, fie mai muli bii de
culoare pentru fiecare pixel, dar nu pe amndou; cu alte cuvinte, unul dintre cele dou apeluri de mai sus va returna
valoarea 1. Numrul de culori care pot fi redate de o plac video se poate calcula cu formula urmtoare:
iColors = 1<<(iPlanes * iBitsPixel);
Aceast valoare poate s nu fie identic cu numrul de culori obinut prin apelarea funciei GetDeviceCaps cu parametrul
NUMCOLORS:
iColors = GetDeviceCaps (hdc, NUMCOLORS);
Windows folosete pentru reprezentarea culorilor o valoare ntreag fr semn, pe 32 de bii. Tipul de date folosit
pentru culori se numete COLORREF. Ultimii trei octei ai numrului (cei mai puin semnificativi) specific valorile pentru
culorile rou, verde i albastru, de la O la 255. Rezult o palet potenial de 224 culori (aproximativ 16 milioane de
culori).

68. Obinerea variabilei handle a contextului de dispozitiv. Obinerea informaiilor despre contextul de
dispozitiv.
Obtinerea variablilei Handle a CD>
hdc - BeginPaint (hwnd, &ps);
[alte Unii de program] EndPaint (hwnd, &ps);//Permite desenarea doar in zona invalida si validarea acesteia
hdc = GetDC (hwnd);
(alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga zona client
hdc = GetWindowDC (hwnd);
[alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga fereastra ce poate creaa efecte
nedorite
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);
De exemplu, putei s obinei variabila handle a contextului de dispozitiv pentru tot spaiul de afiare, cu urmtorul
apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
Uneori avei nevoie de unele informaii despre un context de dispozitiv fr s desenai nimic. n aceast situaie putei
s obinei o variabila handle a contextului de informaii (information context") folosind funcia CreateIC. Parametrii
sunt aceiai ca i pentru funcia CreateDC:
hdclnfo = CreatelC ("DISPLAY", NULL, NULL, NULL);
[alte linii de program] DeleteDC (hdclnfo);
Atunci cnd lucrai cu imagini bitmap, poate fi uneori util obinerea unui context de dispozitiv n memorie":
hdcMem = CreateCompatibleDC (hdc);
[alte linii de program] DeleteDC (hdcHem)
Putei s creai un metafiier prin obinerea unui context de dispozitiv pentru metafiiere:
hdcMeta = CreateMetaFile (pszFilename);
[alte linii de program] hmf = CloseMetaFile (hdcMeta);
Dac avei nevoie de anumite informaii despre acest dispozitiv>, cum ar fi dimensiunile ecranului (dimensiunile n
pixeli i cele fizice) sau posibilitile de folosire a culorilor, putei s le obinei prin apelarea funciei GetDeviceCaps (get
device capabilities"):
iValue = GetDeviceCaps (hdc, iIndex) ;
Parametrul iIndex este unul dintre cei 28 de identificatori definii n fiierele antet din Windows. De exemplu, dac iIndex
are valoarea HORZRES funcia GetDeviceCaps returneaz limea dispozitivului n pixeli; VERTRES returneaz nlimea
dispozitivului n pixeli.
69. Parametrul PitchAndFamily. Funcia SetTextAlign.

Pentru fonturile cu dimensiune fix, cxCaps este egal cu cxChar. Pentru fonturile cu dimensiune variabil, cxCaps este
150% din cxChar. Bitul cel mai puin semnificativ al cmpului tmPitchAndFamily din structura TEXTMETRIC are valoarea 1
pentru fonturile cu dimensiune variabil i valoarea 0 pentru fonturile cu dimensiune fix. Programul SYSMETS1 folosete
acest bit ca s calculeze valoarea cxCaps din cxChar:

cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;


Toate operaiile de desenare n fereastr sunt fcute n timpul prelucrrii mesajului WM_PAINT.

Nu ar fi mai simplu dac am putea s afim o coloan de numere aliniate la dreapta prin specificarea poziiei n care se
termin numerele, n locul poziiei la care ncep acestea? Dup ce programul SYSMETS apeleaz funcia:

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

coordonatele transmise funciilor TextOut care urmeaz specific localizarea colului din dreapta-sus al irului de caractere, n
locul colului din stnga-sus.

Funcia TextOut care afieaz coloana de numere are ca al doilea parametru urmtoarea expresie:

cxChar + 22 * cxCaps + 40 * cxChar

Valoarea 40 x cxChar reprezint limea nsumat a coloanelor doi i trei. Dup apelarea funciei TextOut este apelat din
nou funcia SetTextAlign, pentru a readuce la normal modul de aliniere a textului.
70. Pensule haurate". Stiluri de haura. Funcia CreatePatternBrush.
Putei s creai i o pensul haurat" cu linii orizontale, verticale sau oblice. Acest stil de pensule este folosit frecvent
pentru colorarea barelor din diagrame sau grafice i pentru desenele executate de plottere. Funcia care creeaz o pensul
haurat este:

hBrush = CreateHatchBrush (iHatchStyle, rgbColor) ;

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. Parametrul rgbColor din funcia
CreateHatchBrush reprezint culoarea liniilor cu care se face haurarea. Atunci cnd selectai pensula n contextul de
dispozitiv, Windows convertete aceast culoare n cea mai apropiat culoare pur. Spaiul dintre liniile de haur sunt
colorate n funcie de modul de desenare a fondului i de culoarea fondului, definite n contextul de dispozitiv. Dac modul de
desenare a fondului este OPAQUE, culoarea fondului este folosit pentru umplerea spaiilor dintre linii, n acest caz, nici liniile
de haur, nici culoarea de umplere nu pot fi culori amestecate. Dac modul de desenare a fondului este TRANSPARENT,
Windows deseneaz liniile de haura fr s umple spaiile dintre acestea.

Deoarece pensulele sunt ntotdeauna imagini bitmap 8x8, aspectul pensulelor haurate va depinde de rezoluia dispozitivului
pe care se face afiarea.

Cu ajutorul funciei CreatePatternBrush putei s creai pensule proprii, bazate pe o imagine bitmap:

hBrush = CreatePatternBrush (hBitmap) ;

71. Redesenarea zonei client. Ciclul de mesaje. Structura de tip MSG. Funciile GetMessage,
TranslateMessage, DispatchMessage.
Afiarea ferestrei
Dup executarea funciei CreateWindow, fereastra a fost creat de Windows, dar nc nu este afiat pe ecran. Pentru
aceasta mai sunt necesare nc dou apeluri de funcii. Primul este:

ShowWindow (hwnd, iCmdShow) ;

Primul parametru este o variabil handle a ferestrei create de funcia CreateWindow. Al doilea parametru este variabila
iCmdShow, transmis funciei WinMain. Dac iCmdShow este SW_SHOWNORMAL (egal cu 1), fereastra este afiat normal.
Dac iCmdShow este SW_SHOWMINNOACTIVE (egal cu 7), atunci fereastra nu este afiat, dar numele i pictograma acesteia
apar pe bara de taskuri.

n programul HELLOWIN funcia ShowWindow afieaz fereastra pe ecran. Dac al doilea parametru al funciei este
SW_SHOWNORMAL, Windows terge zona client a ferestrei folosind pensula specificat n clasa ferestrei. Apelul:

UpdateWindow (hwnd) ;

determin redesenarea zonei client. Acest lucru se face prin trimiterea ctre procedura de fereastr (funcia WndProc din
HELLOWIN.C) a unui mesaj WM_PAINT. Vom vedea imediat cum trateaz funcia WndProc aceste mesaje.

Ciclul de mesaje
Dup apelarea funciei UpdateWindow, fereastra devine vizibil pe ecran. Programul trebuie s fie acum pregtit s
citeasc intrrile de la mouse i de la tastatur. Windows formeaz o coad de mesaje" pentru fiecare program rulat
concurenial. Atunci cnd apare un eveniment exterior, Windows convertete acest eveniment ntr-un mesaj pe care l
plaseaz n coada de ateptare.

Un program preia mesajele din coada de ateptare prin executarea unei secvene de cod numit ciclu de mesaje"
(message loop"):
while (GetMessage (&msg, NULL, 0, 0))

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

return msg.wParam ;

Variabila msg este o structur de tip MSG, definit n fiierele antet din Windows astfel:

typedef struct tagMSG

HWND hwnd ;

UINT message ;

WPARAM wParam ;

LPARAM lParam ;

DWORD time ;

POINT pt ;

MSG ,

Tipul de date POINT este tot o structur, definit astfel:

typedef struct tagPOINT

LONG x ;

LONG y ;

POINT ;

Funcia GetMessage apelat la nceputul ciclului de mesaje preia un mesaj din coada de ateptare:

GetMessage (&msg, NULL, 0, 0)


Acest apel transmite sistemului de operare un pointer, numit msg, la o structur de tip MSG. Al doilea, al treilea i al
patrulea parametru au valoarea NULL sau 0, ceea ce indic faptul c programul vrea s preia toate mesajele, pentru toate
ferestrele create de program. Windows completeaz cmpurile structurii de mesaje cu urmtorul mesaj din coada de
ateptare. Cmpurile acestei structuri sunt:

hwnd - variabila handle a ferestrei creia i este destinat mesajul. n programul HELLOWIN, aceasta este aceeai cu
valoarea hwnd returnat de funcia CreateWindow, deoarece aceasta este singura fereastr a programului.
message - identificatorul mesajului. Acesta este un numr folosit pentru identificarea mesajului. Pentru fiecare mesaj n
fiierele antet din Windows este definit un identificator care ncepe cu prefixul WM_ (window message"). De exemplu,
dac poziionai indicatorul mouse-ului n zona client a programului HELLOWIN i apsai butonul din stnga, Windows
va insera n coada de ateptare un mesaj pentru care cmpul message conine identificatorul WM_LBUTTONDOWN, adic
valoarea 0x0201.
wParam - un parametru pe 32 de bii a crui valoare depinde de mesajul trimis.
lParam - un alt parametru pe 32 de bii dependent de mesaj.
time - momentul inserrii mesajului n coada de mesaje.
pt - coordonatele poziiei mouse-ului n momentul inserrii mesajului n coada de mesaje.
Instruciunea:

TranslateMessage (&msg) ;

retransmite structura msg sistemului de operare, pentru convertirea unor mesaje de la tastatur.

Instruciunea:
DispatchMessage (&msg) ;

ca i funcia TranslateMessage, retransmite structura msg sistemului de operare. Windows trimite apoi mesajul ctre
procedura de fereastr corespunztoare, n vederea prelucrrii - cu alte cuvinte, Windows apeleaz procedura de fereastr. n
programul HELLOWIN, procedura de fereastr este WndProc. Dup ce prelucreaz mesajul, funcia WndProc pred controlul
sistemului de operare, care nc elaboreaz rspunsul la apelul DispatchMessage. Atunci cnd Windows returneaz controlul
programului HELLOWIN, dup executarea apelului DispatchMessage, ciclul de tratare a mesajelor continu cu urmtorul apel
al funciei GetMessage.

Funcia DispatchMessage transmite mesajul procedurii de fereastr corespunztoare. ntre cele dou funcii este apelat
funcia TranslateMessage, care transform mesajele generate de acionarea tastelor n mesaje caracter. Dac mesajul este
WM_KEYDOWN sau WM_SYSKEYDOWN i dac tasta apsat, n funcie de starea tastelor de modificare, genereaz un
caracter, atunci funcia TranslateMessage insereaz un mesaj caracter n coada de ateptare.

72. Sistemul i cronometrul. Timpul Windows standard.


Sistemul i cronometrul

Cronometrul din Windows este o extensie relativ simpl a logicii de ceas implementat hardware n calculatoarele
personale i n sistemul ROM BIOS. Sistemul ROM BIOS iniializeaz un circuit de ceas care genereaz o ntrerupere de
ceas, numit uneori tact de ceas" sau tact de cronometru". Aceste ntreruperi sunt generate la fiecare 54,925
milisecunde, adic de 18,2 ori pe secund. Unele programe scrise pentru MS DOS intercepteaz aceast ntrerupere pentru
implementarea unor ceasuri sau a unor cronometre.

Programele Windows nu fac acest lucru. ntreruperile hardware sunt tratate chiar de sistemul de operare, aa c
aplicaiile nu mai trebuie s fac acest lucru. Pentru fiecare program care creeaz un cronometru, Windows trateaz
ntreruperile de ceas decrementnd contorul transmis prin apelarea funciei SetTimer. Atunci cnd aceast valoare ajunge la 0,
Windows plaseaz n coada de ateptare a aplicaiei un mesaj WM_TIMER i atribuie contorului valoarea original.

Deoarece programele Windows preiau mesajele WM_TIMER din coada de ateptare nu trebuie s v facei probleme privind
ntreruperea unei operaii de prelucrare prin sosirea unui mesaj WM_TIMER. Din acest punct de vedere, cronometrul se
aseamn cu tastatura i cu mouse-ul: driverul trateaz evenimentele asincrone generate de ceasul hardware, iar Windows
transform aceste evenimente n mesaje structurate i serializate.

Cronometrul Windows are aceeai rezoluie de 54,925 milisecunde ca i ceasul hardware al calculatorului, pe care de fapt
se bazeaz. Acest lucru are dou implicaii importante:

O aplicaie Windows nu poate s primeasc mesaje WM_TIMER cu o rat mai mare de 18,2 ori/secund dac
folosete un singur cronometru.
Intervalul de timp pe care l specificai la apelarea funciei SetTimer este rotunjit la un multiplu ntreg de tacturi de
ceas.
73. Tipul PAINTSTRCUT, MM_TEXT. Regiuni de decupare (clipping region). Fontul sistem SYSTEM_FONT.
Structura de informaii pentru desenare
Am vorbit anterior despre structura de informaii pentru desenare" (paint information structure") pstrat de Windows
pentru fiecare fereastr. Aceast structur este definit astfel:

typedef struct tagPAINTSTRUCT

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

PAINTSTRCUT;

Windows completeaz cmpurile acestei structuri atunci cnd programul dumneavoastr apeleaz funcia BeginPaint.
Programul poate s foloseasc numai primele trei cmpuri, celelalte fiind folosite intern de sistemul de operare.

Cmpul hdc reprezint variabila handle a contextului de dispozitiv. Deoarece redundana este tipic pentru sistemul de
operare Windows, valoarea returnat de funcia BeginPaint este aceeai variabil handle.

n majoritatea cazurilor, cmpul fErase va avea valoarea TRUE (diferit de zero), ceea ce nseamn c Windows a ters
fondul dreptunghiului invalid. Pentru tergerea fondului, Windows folosete pensula specificat n cmpul hbrBackground al
structurii WNDCLASSEX, pe care ai folosit-o la nregistrarea clasei n timpul iniializrilor, din funcia WinMain. Multe
programe Windows folosesc o pensul de culoare alb:

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

Totui, dac programul invalideaz un dreptunghi din zona client apelnd funcia InvalidateRect, ultimul parametru al
funciei specific dac vrei ca fondul s fie ters. Dac acest parametru este FALSE (0), Windows nu va terge fondul i cmpul
fErase va avea valoarea FALSE.

Cmpul rcPaint al structurii PAINTSTRUCT este o structur de tip RECT. Aa cum ai aflat din Capitolul 2, structura RECT
definete un dreptunghi. Cele patru cmpuri ale structurii sunt left, top, right i bottom. Cmpul rcPaint al structurii
PAINTSTRUCT definete limitele unui dreptunghi invalid, aa cum se poate vedea n figura 3.1. Valorile sunt date n pixeli, i se
raporteaz la colul din stnga-sus al zonei client a ferestrei. Dreptunghiul invalid este suprafaa pe care ar trebui s o
redesenai. Dei un program Windows ar putea s redeseneze ntreaga zon client a ferestrei de fiecare dat cnd primete un
mesaj WM_PAINT, redesennd numai poriunea ferestrei definit de dreptunghi programul economisete timp.

Dreptunghiul rcPaint din structura PAINTSTRUCT nu este un simplu dreptunghi invalid, ci un dreptunghi de decupare"
(clipping rectangle). Aceasta nseamn c Windows restricioneaz desenarea n interiorul dreptunghiului. Atunci cnd folosii
variabila handle a contextului de dispozitiv din structura PAINTSTRUCT, Windows nu deseneaz n afara dreptunghiului
rcPaint.
Pentru desenarea n afara dreptunghiului rcPaint n timpul prelucrrii mesajului WM_PAINT, facei urmtorul apel:
InvalidateRect (hWnd, NULL, TRUE); naintea apelrii funciei BeginPaint. Apelul de mai sus invalideaz ntreaga zon client i
terge fondul acesteia. Dac ultimul parametru are valoarea FALSE, fondul nu este ters i desenul va fi fcut peste ceea ce
exist deja.

n Windows exist diferite moduri de mapare care controleaz transformarea coordonatelor logice transmise funciilor GDI
n coordonate fizice ale pixelilor afiai pe ecran. Modul de mapare este definit n contextul de dispozitiv. Modul de mapare
prestabilit este MM_TEXT (folosind identificatorul definit n fiierele antet Windows). n modul de mapare MM_TEXT, unitile
logice sunt aceleai cu unitile fizice, adic pixelii; ele se raporteaz la colul din stnga-sus al zonei client, iar valorile
coordonatei y cresc pe msur ce cobori n zona client a ferestrei (vezi Figura 3.2). Sistemul de coordonate MM_TEXT este
acelai cu sistemul de coordonate folosit de Windows pentru definirea dreptunghiului invalid din structura PAINTSTRUCT.

Contextul de dispozitiv definete i o regiune de decupare (clipping region). Aa cum ai vzut, regiunea prestabilit de
decupare este ntreaga zon client, pentru o variabil handle a contextului de dispozitiv obinut prin apelarea funciei GetDC,
sau numai regiunea invalid, pentru o variabil handle a contextului de dispozitiv obinut prin apelarea funciei BeginPaint.
Windows nu afieaz partea care se afl n afara regiunii de decupare i care aparine irului de caractere, ci numai poriunile
care sunt cuprinse n regiunea de decupare. Scrierea n afara zonei client a unei ferestre este o operaiune dificil, aa c nu v
speriai - nu este posibil s facei acest lucru din greeal.

Fontul sistem

Tot n contextul de dispozitiv este definit i fontul pe care sistemul de operare Windows l folosete pentru scrierea textului
n zona client. Fontul prestabilit este numit font sistem" sau (folosind identificatorul definit n fiierele antet Windows)
SYSTEM_FONT. Fontul sistem este fontul pe care Windows l folosete pentru textul din barele de titlu, barele de meniu i
casetele de dialog.

La nceputurile sistemului de operare Windows, fontul sistem era un font cu dimensiune fix, ceea ce nseamn c toate
caracterele aveau aceeai lime, ca la mainile de scris. ncepnd cu versiunea Windows 3.0 i continund pan la Windows
95, fontul sistem este un font cu dimensiune variabil, ceea ce nseamn c fiecare caracter are o alt dimensiune. De exemplu,
W" este mai lat dect i". Este foarte clar c un text scris cu un font avnd dimensiune variabil este mai uor de citit dect un
font cu dimensiune fix.

Fontul sistem este un font de tip rastru", ceea ce nseamn c fiecare caracter este definit ca un bloc de pixeli. Fontul
sistem trebuie proiectat astfel nct pe ecran s ncap cel puin 25 de linii cu cte 80 de caractere. Aceasta este singura
garanie privind compatibilitatea ntre dimensiunea ecranului i dimensiunea fontului.

74. Umplerea golurilor. Modul de desenare a fondului OPAQUE. Funciile SetBkColor, SetBkMode.
Umplerea golurilor
Folosirea penielor pentru linii punctate sau pentru linii ntrerupte ridic o ntrebare interesant: ce se ntmpl cu
pauzele dintre puncte sau dintre liniue? Culoarea acestor spaii depinde de atributele pentru culoarea fondului i de modul de
desenare a fondului, definite n contextul de dispozitiv.

Modul prestabilit de desenare a fondului este OPAQUE, ceea ce nseamn c Windows umple spaiile cu culoarea fondului,
care n mod prestabilit este alb. Rezultatele sunt aceleai n cazul pensulei WHITE_BRUSH, folosit de majoritatea programelor
n clasa ferestrei pentru tergerea fondului.

Putei s schimbai culoarea fondului pentru completarea spaiilor goale dintre linii, prin apelarea funciei SetBkColor:

SetBkColor (hdc, rgbColor) ;

Ca i n cazul valorii rgbColor folosit pentru culoarea peniei, Windows convertete valoarea specificat ntr-o culoare
pur. Putei s obinei culoarea defint n contextul de dispozitiv prin apelarea funciei GetBkColor.

De asemenea, putei s mpiedicai colorarea spaiilor stabilind modul TRANSPARENT de desenare a fondului:

SetBkMode (hdc, TRANSPARENT) ;


Windows va ignora culoarea fondului i nu va mai colora spaiile goale. Modul de desenare a fondului (TRANSPARENT sau
OPAQUE) poate fi obinut cu ajutorul funciei GetBkMode.

75. Utilizarea cronometrului pentru a realiza un ceas.


Obinerea orei i a datei

n funcia WndPaint, programul DIGCLOCK folosete funciile C time i localtime ca s determine data i ora curente. Funcia
localtime stocheaz toate informaiile de care avem nevoie ntr-o structur; mai multe macroinstruciuni definite n
partea superioar a programului fac apelurile funciei wsprintf mai uor de citit.

Internaionalizarea programului

Windows asigur suportul pentru internaionalizarea programelor. Fiierul WIN .INI - creat n timpul instalrii sistemului de
operare - conine o seciune cu titlul [intl]. n aceast seciune sunt incluse informaii legate de formatul datei, al orei, al
monedei naionale i al numerelor. Putei s afiai data n unul dintre urmtoarele trei formate: lun-zi-an, an-lun-zi sau zi-
lun-an. Separatorul dintre cele trei numere poate fi caracterul slash, liniua de desprire, punctul sau orice alt caracter
dorii. Putei s afiai ora n formatul pe 12 sau pe 24 de ore; de obicei, pentru separarea orelor, minutelor sau a
secundelor este folosit caracterul dou puncte.

Funcia Setlnternational din programul DIGCLOCK obine informaii de formatare din fiierul WIN.INI folosind funciile
GetProfilelnt (pentru numere ntregi) i GetProfileString (pentru iruri de caractere). La apelarea acestor funcii trebuie s fie
incluse valori prestabilite, pentru cazurile n care Windows nu poate gsi valorile cutate n fiierul WIN.INI. Funcia
Setlnternational stocheaz valorile obinute n variabile globale care au ca nume irurile de caractere folosite n fiierul
WIN.INI pentru identificarea valorilor respective. Funcia WndPaint folosete valorile obinute din fiierul WIN.INI pentru
formatarea datei i a orei afiate, apoi apeleaz funcia DrawText pentru centrarea celor dou linii de text n fereastr.

Aa cum este de ateptat, de fiecare dat cnd procedura de fereastr primete un mesaj WM_TIMER, programul
DIGCLOCK invalideaz fereastra pentru generarea unui mesaj WM_PAINT. Dar funcia WndProc invalideaz fereastra i
atunci cnd primete un mesaj WM_WININICHANGE. Orice program care modific fiierul WIN.INI trimite mesaje
WM_WININICHANGE tuturor aplicaiilor Windows active.

Atunci cnd primete un mesaj WM_TIMER, programul DIGCLOCK invalideaz fereastra astfel:

InvalidateRect (hwnd, NULL, FALSE) ;

Valoarea TRUE folosit pentru ultimul parametru al funciei InvalidateRect determin tergerea fondului ferestrei nainte de
redesenare. Dac acest parametru are valoarea FALSE, Windows deseneaz peste fondul existent. Am folosit valoarea
FALSE n timpul prelucrrii mesajului WMTIMER pentru reducerea efectului de licrire a imaginii afiate.

La recepionarea unui mesaj WM_TIMER, cea mai mare modificare a lungimii este de dou caractere - de exemplu, atunci
cnd data se schimb de la 12/31 /96 la 1 /1 /97 - aa c irul de caractere formatat folosit pentru afiare de funcia WndPaint
are la fiecare capt dou spaii suplimentare, acoperitoare pentru aceast modificare n lungime i pentru diferenele
datorate folosirii unui font proporional. Am putea s includem n programul DIGCLOCK i logica de prelucrare a mesajelor
WM TIMECHANGE, care informeaz aplicaiile privind modificarea datei sau a orei sistemului. Deoarece informaiile
deinute de programul DIGCLOCK sunt actualizate la fiecare secund prin mesaje WM_TIMER, acest lucru nu este necesar.
Prelucrarea mesajelor WM_TIMECHANGE ar avea sens pentru un ceas actualizat la fiecare minut.

76. Utilizarea cronometrului pentru animaii.


ANIMAII

Programul BOUNCE reconstruiete mingea de fiecare dat cnd programul primete un mesaj WM_SIZE. Pentru
aceasta este nevoie de un context de dispozitiv compatibil cu monitorul video:

hdcMem = CreateCompatibleDC (hdc) ;

Diametrul mingii este 1/16 din minimul dintre limea i nlimea zonei client a ferestrei. Totui, programul
construiete o imagine bitmap mai mare dect mingea: pe fiecare dintre cele patru laturi imaginea bitmap este mai mare
dect mingea, cu jumtate din raza acesteia:

hBitmap = CreateCompatibleBitmap (hdc, cxTotal, cyTotal) ;


Dup ce este selectat n contextul de dispozitiv din memorie, ntreaga imagine bitmap este colorat cu alb, pentru
obinerea fondului:

Rectangle (hdcMem, -1, -1, xTotal + 1, yTotal + 1) ;

n contextul de dispozitiv din memorie este selectat o pensul cu haur diagonal, apoi este desenat mingea, n centrul
imaginii bitmap:

Ellipse (hdcMem, xMove, yMove, xTotal - xMove, yTotal - yMove) ;

Spaiile libere pstrate n imaginea bitmap n jurul mingii terg imaginea anterioar a mingii atunci cnd mingea este mutat.
Pentru redesenarea mingii ntr-o alt poziie este nevoie doar de apelarea funciei BitBlt folosind codul ROP2RCCOPY:
BitBlt (hdc, xCenter - xTotal / 2, yCenter - yTotal / 2, xTotai, yTotal, hdcMem, 0, 0, SRCCOPY) ;

Programul BOUNCE ilustreaz cea mai simpl cale de deplasare a unei imagini pe ecran, dar acest mod de abordare nu
este satisfctor n toate situaiile. Dac v intereseaz animaiile, v-ar fi de folos examinarea celorlalte coduri ROP (cum ar
fi SRCINVERT) care efectueaz operaii SAU EXCLUSIV ntre surs i destinaie. Alte tehnici de animaie implic folosirea paletei
Windows (i a funciei AnimatePalette) precum i a funciei CreateDIBSection.

77. Utilizarea cronometrului. Prima metod.


Prima metod

Prima metod (i cea mai simpl) determin sistemul de operare s trimit mesajele WM_TIMER ctre procedura de
fereastr normal a aplicaiei. Apelul funciei SetTimer arat astfel:

SetTimer (hwnd, 1, iMsecInterval, NULL);

Primul parametru este o variabil handle pentru fereastra a crei procedur de fereastr va primi mesajele
WM_TIMER. Al doilea parametru este identificatorul cronometrului, care trebuie s fie o valoare diferit de zero i care n
acest exemplu este n mod arbitrar 1. Al treilea parametru este o valoare ntreag fr semn pe 32 de bii, care specific
intervalul de timp n milisecunde. Dac acest parametru are valoarea 60000, programul va primi un mesaj WM_TIMER la
fiecare minut. Putei s oprii generarea mesajelor WM_TIMER n orice moment, chiar i n timpul prelucrrii unui mesaj
WM_TIMER, apelnd funcia:

KillTimer (hwnd, 1);

Al doilea parametru al funciei KillTimer este acelai identificator cu cel folosit la apelarea funciei SetTimer. naintea
terminrii programului, ca rspuns la mesajul WM_DESTROY, este recomandat s distrugei toate cronometrele active din
program.

Atunci cnd procedura de fereastr primete un mesaj WM_TIMER, parametrul wParam conine identificatorul
cronometrului (care n acest caz este 1) iar parametrul lParam este 0. Dac avei nevoie de mai multe cronometre, folosii un
identificator unic pentru fiecare. Valoarea parametrului wParam va diferenia mesajele WM_TIMER trimise ferestrei.
Pentru ca programul s fie mai uor de citit, putei s folosii instruciuni define pentru definirea identificatorilor fiecrui
cronometru:

Dac vrei s schimbai intervalul de timp al unui cronometru existent, oprii cronometrul i apelai din nou
funcia SetTimer:
KillTimer (hwnd, 1);
SetTimer (hwnd, 1, iMsecInterval, NULL);
78. Utilizarea cronometrului. Metoda a doua.
A doua metod

A doua metod v permite s folosii un cronometru astfel nct Windows s trimit mesajele WM_TIMER ctre o alt
funcie din program.

Funcia care recepioneaz mesajele de cronometru este numit funcie cu apel invers (callback). Aceasta este o funcie
din program care poate fi apelat direct de sistemul de operare. Programul comunic sistemului de operare adresa
funciei, iar sistemul de operare Windows apeleaz ulterior funcia.

Ca i procedurile de fereastr, funciile cu apel invers trebuie s fie definite de tipul CALLBACK, deoarece sunt apelate de
Windows din afara spaiului de cod al programului. Parametrii transmii funciilor cu apel invers i valoarea returnat
de acestea depind de scopul funciei. n cazul unei funcii cu apel invers asociate unui cronometru, parametrii de intrare
sunt aceiai cu parametrii de intrare ai unei proceduri de fereastr. Funciile cu apel invers folosite pentru cronometre nu
returneaz nici o valoare ctre sistemul de operare.

Presupunem c funcia cu apel invers se numete TimerProc. (Putei s dai orice nume dorii.) Aceast funcie va prelucra
numai mesajele WM_TIMER.

VOID CALLBACK TimerProc (HWND hwnd, UINT iMsg, UINT iTimerlD, DWORD dwTime) [prelucreaz mesajele
WM_TIMER]

Parametrul de intrare hwnd reprezint variabila handle a ferestrei specificate la apelarea funciei SetTimer. Windows va
trimite funciei TimerProc numai mesajele WM_TIMER, aa c parametrul iMsg va avea ntotdeauna valoarea WM_TIMER.
Parametrul iTimerlD conine identificatorul cronometrului, iar parametrul dwTime reprezint timpul sistemului.

Aa cum am menionat anterior, prima metod de pornire a unui cronometru impune apelarea funciei SetTimer n
felul urmtor:

SetTimer (hwnd, iTimerlD, iHsednterval, NULL) ;

Atunci cnd folosii o funcie cu apel invers pentru prelucrarea mesajelor WM_TIMER, al patrulea parametru al
funciei SetTimer trebuie s conin adresa funciei cu apel invers, ca n exemplul urmtor:

SetTimer (hwnd, iTimerlD, iHsednterval, (TIMERPROC) TimerProc) ;

79. Utilizarea cronometrului. Metoda a treia.


A treia metod

A treia metod este asemntoare cu cea de-a doua, cu diferena c parametrul hwnd din apelul funciei SetTimer are
valoare NULL, iar al doilea parametru (care ar fi trebuit sa fie identificatorul cronometrului) este ignorat. Rezultatul este
faptul c funcia SetTimer returneaz un identificator al cronometrului:

iTimerID = SetTimer (NULL, 0, iMsecInterval, (TIMERPROC) TimerProc) ;

Variabila iTimerID returnat de funcia SetTimer va avea valoarea NULL dac nu este disponibil nici un cronometru.

Primul parametru al funciei KillTimer (de obicei folosit pentru transmiterea variabilei handle a ferestrei) trebuie s
aib valoarea NULL. Al doilea parametru (identificatorul cronometrului) trebuie s fie valoarea returnat de funcia
SetTimer:

KillTimer (NULL, iTimerlD) ;

Parametrul hwnd transmis funciei TimerProc trebuie s aib tot valoarea NULL.

Aceast metod de pornire a cronometrelor este rareori folosit. Se poate dovedi totui util dac folosii n program
mai multe cronometre n diferite puncte, i nu vrei s inei socoteala identificatorilor pe care deja i-ai folosit.

Acum tii s folosii cronometrele din Windows, aa c este timpul s vedei cteva programe utile.

80. Variabilele handle. Notaia ungar. Punctul de intrare n program. nregistrarea clasei de fereastr.
Crearea ferestrei. Afiarea ferestrei.

Muli programatori Windows folosesc notaia ungar", o convenie de denumire a variabilelor. Convenia este foarte
simpl - fiecare nume de variabil ncepe cu una sau mai multe litere mici care specific tipul de date al variabilei. De exemplu,
prefixul sz al variabilei szCmdLine semnific ir de caractere terminat cu zero". Prefixul h al variabilelor hInstance i
hPrevInstance nseamn variabil handle"; prefixul i al variabilei iCmdShow nseamn ntreg". De exemplu, n funcia
WinMain din programul HELLOWIN.C, variabila msg este o structur de tip MSG iar wndclass este o variabil de tip
WNDCLASSEX. n funcia WndProc, ps este o structur de tip PAINTSTRUCT iar rect este o structur de tip RECT.
Prefix Tip de date
c char

by BYTE (unsigned char)

i int

x, y int (folosit pentru coordonate)

cx, cy int (folosit pentru dimensiuni pe axele x si y, c vine de la contor")

b sau f BOOL (int); f vine de la flag" (indicator)

w WORD (unsigned short)

l LONG (long)

fn funcie

s ir de caractere

sz sir de caractere terminat cu zero

h variabil handle

p pointer

n sfrit, n program sunt folosii trei identificatori cu majuscule pentru diferite tipuri de variabile handle:

Identificator Semnificaie
HINSTANCE Variabil handle a unei instane" - programul nsui

HWND Variabil handle a unei ferestre

HDC Variabil handle a unui context de dispozitiv

O variabil handle este pur i simplu un numr (de obicei pe 32 de bii) care face trimitere la un obiect. Un program obine
aproape ntotdeauna o variabil apelnd o funcie Windows. Programul folosete apoi variabila handle obinut pentru
trimiterea la obiect n alte funcii. Valoarea real a variabilei handle nu este important pentru program, dar modulul
Windows care o furnizeaz programului tie cum s l manipuleze pentru trimiterea la obiect.

Punctul de intrare ntr-un program Windows este o funcie numit WinMain. Funcia WinMain este ntotdeauna definit
astfel:

int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

Aceast funcie folosete secvena de apelare WINAPI i la terminare returneaz sistemului de operare o valoare ntreag.
Numele funciei trebuie s fie WinMain. Aceast funcie are patru parametri:

Parametrul hlnstance este numit variabil handle a instanei" (instance handle"). Acesta este un numr care identific n
mod unic toate programele rulate n Windows. Utilizatorul poate rula simultan mai multe copii ale aceluiai program. Aceste
copii se numesc instane" i fiecare are o valoare diferit pentru parametrul hlnstance.

hPrevInstance (previous instance" - instana anterioar) este un parametru nvechit. n versiunile Windows anterioare
acest parametru coninea variabila handle a celei mai recente instane nc activ a aceluiai program. Dac nu erau ncrcate
alte instane ale programului, hPrevInstance avea valoarea 0 sau NULL.

Parametrul szCmdLine este un pointer la un ir de caractere terminat cu zero care conine eventualii parametri transmii
programului n linia de comand.
Parametrul iCmdShow este un numr care indic modul iniial de afiare a ferestrei n Windows. n majoritatea cazurilor,
iCmdShow are valoarea 1 sau 7. Mai sugestivi sunt identificatorii SW_SHOWNORMAL (definit n Windows ca 1) i
SW_SHOWMINNOACTIVE (definit cu valoarea 7). Prefixul SW vine de la show window" (afiare fereastr). Acest parametru
specific dac fereastra programului este afiat normal sau dac este afiat iniial doar ca o pictogram.

nregistrarea clasei de fereastr

O fereastr este ntotdeauna creat pe baza unei clase de fereastr. Aceasta identific procedura de fereastr care
prelucreaz toate mesajele trimise ctre fereastr.

Pe baza aceleiai clase pot fi create mai multe ferestre. De exemplu, toate butoanele din Windows sunt create pe baza unei
singure clase de fereastr. Aceasta definete procedura de fereastr i alte caracteristici ale ferestrei create pe baza clasei
respective. Atunci cnd creai o fereastr, definii i atributele suplimentare ale acesteia, care sunt unice pentru fereastra
respectiv.

nainte de a crea fereastra programului trebuie s nregistrai o clas de fereastr, apelnd funcia RegisterClassEx.

Funcia RegisterClassEx accept un singur parametru: un pointer la o structur de tipul WNDCLASSEX. Structura
WNDCLASSEX este definit n fiierele antet din Windows astfel:

typedef struct tagWNDCLASSEX

UINT cbSize ;

UINT style ;

WNDPROC lpfnWndProc ;

int cbClsExtra ;

int cbWnExtra ;

HINSTANCE hinstance ;

HICON hicon ;

HCURSOR hCursor ;

HBRUSH hbrBackground ;

LPCSTR lpszMenuName ;

LPCSTR lpszClassName ;

HICON hIconSm ;

WNDCLASSEX ;

n funcia WinMain trebuie s definii o structur de tipul WNDCLASSEX, cum ar fi:

WNDCLASSEX wndclass ;

Apoi definii cele 12 cmpuri ale structurii i apelai funcia RegisterClassEx:

RegisterClassEx (&wndclass) ;
Cele mai importante cmpuri ale structurii sunt al treilea i penultimul. Penultimul cmp conine numele clasei de
fereastr. Al treilea cmp (lpfnWndProc) este adresa procedurii de fereastr folosit pentru toate ferestrele create pe baza
acestei clase. Celelalte cmpuri descriu caracteristicile tuturor ferestrelor create pe baza acestei clase.

cbSize reprezint dimensiunea structurii.

wndclass.style = CS_HREDRAW | CS_VREDRAW ; combin doi identificatori pentru stilul de clas". Acestea sunt constante
pe 32 de bii n care un singur bit are valoarea 1. Cei doi identificatori pentru stilul clasei indic faptul c
toate ferestrele create pe baza acestei clase sunt redesenate complet, ori de cte ori se modific
dimensiunea pe orizontal (CS_HREDRAW) sau cea pe vertical (CS_VREDRAW) a ferestrei

wndclass.lpfnWndProc = WndProc ; Aceast instruciune stabilete ca procedur de fereastr funcia WndProc. Aceast
procedur va prelucra toate mesajele trimise ctre toate ferestrele create pe baza acestei clase de
fereastr. Aa cum am artat mai sus, prefixul lpfn nseamn, n notaia ungar, pointer de tip
long la o funcie".

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ; rezerv un spaiu suplimentar n structura clasei i n structura ferestrei, pstrat n interiorul
sistemului de Windows. Un program poate s utilizeze spaiul suplimentar n scopuri
proprii.

wndclass.hInstance = hinstance ; variabila handle a instanei

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; definesc o pictogram pentru ferestrele create pe baza acestei
clase. Pictograma este o mic imagine de tip bitmap care apare n bara de taskuri a sistemului de operare i n bara de titlu a
ferestrei. Pentru obinerea unei variabile handle a unei pictograme predefinite apelai funcia LoadIcon cu primul parametru
avnd valoarea NULL. Nu ne intereseaz valoarea real a acestei variabile, ci doar o stocm n cmpurile hIcon i hIconSm.

wndclass.hCursor = LoadCursor (NULL, IDC_ ARROW) ; Funcia LoadCursor ncarc un cursor predefinit pentru mouse,
numit IDC_ARROW, i returneaz o variabil handle a acestui cursor. Atunci cnd este deplasat deasupra zonei client a
ferestrei create pe baza acestei clase, indicatorul mouse-ului este afiat sub forma unei sgei.

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); precizeaz culoarea fondului zonei client a


ferestrelor create pe baza acestei clase. Prefixul hbr al numelui hbrBackground vine de la handle to a brush".

Funcia GetStockObject returneaz o variabil handle a unei pensule albe.

wndclass.lpszMenuName = NULL ; meniul ferestrei


wndclass.IpszClassName = szAppName ;

Se nregistreaz clasa de ferestre prin apelarea funciei RegisterClassEx. Singurul parametru al funciei este un pointer
ctre structura WNDCLASSEX:

RegisterClassEx (&wndclass) ;

Crearea ferestrei

Clasa de fereastr definete caracteristicile generale ale unei ferestre, permind astfel folosirea aceleiai clase pentru
crearea mai multor ferestre.

hwnd =CreateWindow (szAppName, // numele clasei de fereastra

"The Hello Program", // titlul ferestrei

WS_OVERLAPPEDWINDOW, // stilul ferestrei


CW_USEDEFAULT, // poziia iniiala pe axa x

CW_USEDEFAULT, // poziia iniiala pe axa y

CW_USE DEFAULT, // dimensiunea iniiala pe axa x

CW_USEDEFAULT, // dimensiunea iniiala pe axa y

NULL, // variabila handle a ferestrei printe

NULL, // variabila handle a meniului

hlnstance, // variabila handle a instanei programului

NULL) ; // parametri de creare

Fereastra creat de acest program este o fereastr normal suprapus, cu o bar de titlu; n partea stng a barei de titlu
se afl caseta cu meniul sistem; n partea dreapt se afl butoanele de mrire, de micorare i de nchidere; fereastra are un
chenar ngroat, care permite redimensionarea. Acesta este stilul standard al ferestre lor, numit WS_OVERLAPPEDWINDOW;
n funcia CreateWindow i corespunde comentariul stilul ferestrei". Titlul ferestrei" este textul afiat n bara de titlu.

Parametrii notai cu poziia iniial pe axa x" i poziia iniial pe axa y" specific poziia iniial a colului din stnga-sus
al ferestrei, relativ la colul din stnga-sus al ecranului. Prin folosirea identificatorului CW_USEDEFAULT pentru aceti para
metri indicm sistemului de operare s foloseasc valorile prestabilite pentru o fereastr suprapus. Parametrii dimensiunea
iniial pe axa x" i dimensiunea iniial pe axa y" specific dimensiunile iniiale ale ferestrei. Identificatorul
CW_USEDEFAULT indic sistemului de operare s foloseasc valorile prestabilite.

Parametrul indicat ca variabil handle a ferestrei printe" are valoarea NULL, deoarece aceast fereastr nu are nici o
fereastr printe. Atunci cnd ntre dou ferestre exist o relaie printe-descendent, fereastra descendent este afiat
ntotdeauna pe suprafaa ferestrei printe. Parametrul indicat ca variabil handle a meniului" are tot valoarea NULL, deoarece
fereastra nu are meniu. Parametrul indicat ca variabil handle a instanei programului" are ca valoare variabila handle
transmis programului ca parametru la apelarea funciei WinMain. n sfrit, parametrul de creare" are valoarea NULL.

Funcia Create Window returneaz o variabil handle a ferestrei create. Aceasta este salvat n variabila hwnd, definit ca
fiind de tipul HWND (variabil handle a unei ferestre). Orice fereastr din Windows are o variabil handle. Programul
folosete variabila handle pentru indicarea ferestrei. Dac un program creeaz mai multe ferestre, fiecare are o variabil
handle diferit.

AFIAREA FERESTREI
Dup executarea funciei CreateWindow, fereastra a fost creat de Windows, dar nc nu este afiat pe ecran. Pentru
aceasta mai sunt necesare nc dou apeluri de funcii. Primul este:

ShowWindow (hwnd, iCmdShow) ;

Primul parametru este o variabil handle a ferestrei create de funcia CreateWindow. Al doilea parametru este variabila
iCmdShow, transmis funciei WinMain. Dac iCmdShow este SW_SHOWNORMAL (egal cu 1), fereastra este afiat normal.
Dac iCmdShow este SW_SHOWMINNOACTIVE (egal cu 7), atunci fereastra nu este afiat, dar numele i pictograma acesteia
apar pe bara de taskuri.

Apelul:

UpdateWindow (hwnd) ;

determin redesenarea zonei client. Acest lucru se face prin trimiterea ctre procedura de fereastr a unui mesaj
WM_PAINT.
DOT NET
81. Arhitectura .NET Framework. Compilarea programelor. De ce am alege .NET?

.NET este un cadru (Framework) de dezvoltare software unitar care permite realizarea, distribuirea i rularea
aplicaiilor desktop Windows i aplicaiilor WEB. Tehnologia .NET pune laolalt mai multe tehnologii (ASP, XML, OOP,
SOAP, WDSL, UDDI) i limbaje de programare (VB, C++, C#, J#) asigurnd, totodat, att portabilitatea codului compilat
ntre diferite calculatoare cu sistem Windows, ct i reutilizarea codului n programe, indiferent de limbajul de
programare utilizat.

Componenta .NET Framework este format din compilatoare, biblioteci i alte executabile utile n rularea aplicaiilor
.NET. Fiierele corespunztoare se afl, n general, n directorul C:\WINDOWS\Microsoft. NET\Framework\V2.0.
(corespunztor versiunii instalate)

Un program scris ntr-unul dintre limbajele .NET conform Common Language Specification (CLS) este compilat n
Microsoft Intermediate Language (MSIL sau IL). Codul astfel obinut are extensia "exe", dar nu este direct executabil, ci
respect formatul unic MSIL. CLR include o main virtual asemntoare cu o main Java, ce execut instruciunile IL
rezultate n urma compilrii. Maina folosete un compilator special JIT (Just In Time). Compilatorul JIT analizeaz codul
IL corespunztor apelului unei metode i produce codul main adecvat i eficient. El recunoate secvenele de cod
pentru care s-a obinut deja codul main adecvat, permind reutilizarea acestuia fr recompilare, ceea ce face ca, pe
parcursul rulrii, aplicaiile .NET s fie din ce n ce mai rapide. Faptul c programul IL produs de diferitele limbaje este
foarte asemntor are ca rezultat interoperabilitatea ntre aceste limbaje. Astfel, clasele i obiectele create ntr-un
limbaj specific .NET pot fi utilizate cu succes n altul.

n plus, CLR se ocup de gestionarea automat a memoriei (un mecanism implementat n platforma .NET fiind acela
de eliberare automat a zonelor de memorie asociate unor date devenite inutile Garbage Collection). Ca un element
de portabilitate, trebuie spus c .NET Framework este implementarea unui standard numit Common Language
Infrastructure (http://www.ecma-international.org/publications/standards/Ecma-335.htm ), ceea ce permite rularea
aplicaiilor .NET, n afar de Windows, i pe unele tipuri de Unix, Linux, Solaris, Mac OS X i alte sisteme de operare
(http://www.mono-project.com/Main_Page ).

De ce am alege .NET?

n primul rnd pentru c ne ofer instrumente pe care le putem folosi i n alte programe, ofer acces uor la baze
de date, permite realizarea desenelor sau a altor elemente grafice. Spaiul de nume System.Windows.Forms conine
instrumente (controale) ce permit implementarea elementelor interfeei grafice cu utilizatorul. Folosind aceste
controale, putei proiecta i dezvolta rapid i interactiv, elementele interfeei grafice. Tot .NET v ofer clase care
efectueaz majoritatea sarcinilor uzuale cu care se confrunt programele i care plictisesc i fur timpul programatorilor,
reducnd astfel timpul necesar dezvoltrii aplicaiilor

82. Introducere n C#. Caracterizare. Crearea aplicaiilor consol


Limbajul C# a fost dezvoltat de o echip restrns de ingineri de la Microsoft, echip din care s-a evideniat Anders
Hejlsberg (autorul limbajului Turbo Pascal i membru al echipei care a proiectat Borland Delphi). C# este un limbaj
simplu, cu circa 80 de cuvinte cheie i 12 tipuri de date predefinite. El permite programarea structurat, modular i
orientat obiectual, conform perceptelor moderne ale programrii profesioniste. Principiile de baz ale programrii
orientate pe obiecte (NCAPSULARE, MOTENIRE, POLIMORFISM) sunt elemente fundamentale ale programrii C#. n
mare, limbajul motenete sintaxa i principiile de programare din C++. Sunt o serie de tipuri noi de date sau funciuni
diferite ale datelor din C++, iar n spiritul realizrii unor secvene de cod sigure (safe), unele funciuni au fost adugate
(de exemplu, interfee i delegri), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate (motenirea
multipl i pointerii ctre funcii). Unele funciuni (cum ar fi accesul direct la memorie folosind pointeri) au fost pstrate,
dar secvenele de cod corespunztoare se consider nesigure.

Crearea aplicaiilor consol

Pentru a realiza aplicaii consol n mediul de dezvoltare Visual Studio, trebuie s instalm o versiune a acestuia. Dup
lansarea aplicaiei, din meniul File se alege opiunea NewProject apoi alegem ConsoleApplication, modificnd numele
aplicaiei n caseta Name.

Cnd creai o aplicaie consol, se genereaz un fiier cu extensia .cs. Extensia cs provine de la C Sharp. Redenumirea lui
se poate realiza din fereastra Solution Explorer, pe care o putei afia cu ajutorul combinaiei de taste Ctrl+W,S sau din
meniul View.

83. Structura unui program C#. Sintaxa limbajului.

O aplicaie C# este format din una sau mai multe clase, grupate n spaii de nume (namespaces). Este obligatoriu ca
doar una din aceste clase s conin un punct de intrare (entry point), i anume metoda (funcia) Main.

Clasa (class), n termeni simplificai, reprezint principalul element structural i de organizare n limbajele orientate spre
obiecte, grupnd date ct i funcii care prelucreaz respectivele date.

n module, dezvoltate separat, de


mai multe persoane. Din acest motiv, exist posibilitatea de a aprea identificatori cu acelai nume. Pentru a evita erori
furnizate din acest motiv, n 1955 limbajul C++ introduce noiunea i cuvntul cheie namespace. Fiecare mulime de
definiii dintr-o librrie sau program este grupat ntr-un spaiu de nume, existnd astfel posibilitatea de a avea ntr-un
program definiii cu nume identic, dar situate n alte spaii de nume. n cazul n care, ntr-o aplicaie, unele clase sunt
deja definite, ele se pot folosi importnd spaiile de nume care conin definiiile acestora. Mai menionm faptul c un
spaiu de nume poate conine mai multe spaii de nume.

Sintaxa limbajului

Ca i limbajul C++ cu care se nrudete, limbajul C# are un alfabet format din litere mari i mici ale alfabetului englez,
cifre i alte semne. Vocabularul limbajului este format din acele simboluri cu semnificaii lexicale n scrierea
programelor: cuvinte (nume), expresii, separatori, delimitatori i comentarii.

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 obiectuale
respect principiulncapsulrii.
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.
87. STRUCTURA UNEI APLICAII ORIENTAT PE OBIECTE N C#. Clas de baz i clase derivate.

n C#, funcionalitatea unei clase poate fi extins aplicnd motenirea. Clasa derivat poate moteni atributele clasei de baz,
metodele acesteia. De asemenea pot fi suprascrise proprietile sau metodele, la necesitate. Motenirea se definete prin
operatorul : . Nu este permis motenirea de la mai mult de o clas de baz.

public class Parent //clasa de baz


{
string parentString;
public Parent() //constructorul clasei de baz
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString) //metoda clasei de baz
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print() //metoda clasei de baz
{
Console.WriteLine("I'm a Parent Class.");
}
}

public class Child : Parent //clasa derivat


{
public Child() : base("From Derived") //base este utilizat pentru a accesa metodele clasei de baz din
clasa derivat
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print(); //base acceseaz metoda print din clasa parent
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child(); //se iniializeaz un obiect de tip Child
child.print(); //se vor afia 2 iruri > unul prin base.print, altul
prin writeline()
((Parent)child).print(); //se acceseaz metoda print din clasa de baz
}
}

88. STRUCTURA UNEI APLICAII ORIENTAT PE OBIECTE N C#. Constructori. Suprancrcarea


constructorilor i definirea constructorilor n clasele derivate. Destructor. Metode.
Cteva noiuni legate de constructorii unei clase:
Constructorul este o funcie care face parte din corpul unei clase. Corpul constructorului este format
din instruciuni care se execut la crearea unui nou obiect al clasei respective (sau la crearea clasei,
n cazul constructorilor cu modificatorul static).
pot exista mai muli constructori care se pot diferenia prin lista lor de parametri
constructorii nu pot fi motenii
dac o clas nu are definit niciun constructor, se va asigna automat constructorul fr parametri al clasei de baz (clasa object,
dac nu este precizat clasa de baz)
Instanierea presupune declararea unei variabile de tipul clasei respective i iniializarea acesteia prin apelul constructorului
clasei (unul dintre ei, dac sunt definii mai muli) precedat de operatorul
new.
public class Copil
{
protected string nume; //data accesibila numai in interiorul
//clasei si a claselor derivate
public Copil ( ) //constructorul fara parametrii ai clasei
{nume = Console.ReadLine( );}
public Copil (string s) //constructor cu parametru
{nume = s;}
}
class Fetita: Copil
{
public Fetita (string s): base(s) //base semnifica faptul ca
{ //se face apel la
nume = "Fetita "+ nume; //constructorul
//din clasa de baza
}}
...
Copil c1 = new Copil ( ); //numele copilului se citeste de la
//tastatura
Copil c2 = new Copil ("Gigel"); //numele lui c2 va fi Gigel
Fetita f1 = new Fetita ( );
Fetita f2 = new Fetita ("Maria");
Destructor:
Corpul destructorului este format din instruciuni care se execut la distrugerea unui obiect al clasei respective. Pentru orice clas
poate fi definit un singur constructor. Destructorii nu pot fi motenii. n mod normal, destructorul nu este apelat n mod explicit,
deoarece procesul de distrugere a unui obiect este invocat i gestionat automat de Garbage Collector

89. CLASE I FUNCII GENERICE. DERIVAREA CLASELOR (MOTENIRE). Principiile motenirii. Accesibilitatea
membrilor motenii.

90. Metode. Interfee n C#.


Metodele sunt subroutine care prelucreaza datele definite in cadrul clasei si pot oferi accesul la acele date.
De regula interactiunea dintre o clasa si celelalte entitati dintr-un program se face prin intermediul metodelor clasei.

Cu ajutorul metodelor putem s organizm codul. Fiecare metoda poate conine mai multe instruciuni, poate returna
sau nu o valoare, sau poate contine parametri. Utilizarea metodelor este util cnd avem nevoie de a repeta o bucat de
cod. Nu vom scrie de 10 ori aceeai bucat de cod, ci vom avea o metoda ce conine codul nostru, pe care o apelm cnd
avem nevoie.

O interfata defineste un set de metode care vor fi implementate de una sau mai multe clase. O interfata nu
implementeaza metode ci doar precizeaza ce anume va contine o clasa care implementeaza interfata. Din punct de
vedere sintactic, interfetele sunt similare claselor abstracte. Insa, exista mai multe aspecte care le diferentiaza. Spre
exemplu: daca in clasele abstracte unele metode erau implementate iar altele nu, in cazul interfetelor toate metodele
nu pot avea corp (nu sunt implementate).

O interfata poate contine doar: metode, proprietati, evenimente si indexari. Interfetele nu pot contine variabile,
constructori sau destructori.
Daca o clasa nu poate mosteni decat o clasa, in schimb o clasa poate implementa oricate interfete. De asemenea, o
interfata poate fi implementata de oricate clase. Asadar, este posibil ca doua clase sa implementeze aceeasi interfata in
moduri diferite.

Daca o clasa implementeaza o interfata atunci aceasta trebuie sa implementeze toti membrii interfetei. Prin intermediul
interfetelor, limbajul C# permite beneficierea la maximum de aspectul o singura interfata mai multe metode al
polimorfismului.

91. TRATAREA EXCEPIILOR N C#. Aruncarea i prinderea excepiilor.

O excepie este un obiect care ncapsuleaz informaii despre o situaie anormal. Excepia se folosete pentru a
semnala contextul n care apare acea situaie deosebit. n C# se pot arunca ca excepii obiecte de tip System.Exception
sau derivate ale lui. Pe lng ierarhia de excepii pe care limbajul C# o are inclus, programatorul i poate crea propriile
sale tipuri excepie. POO ofer o soluie pentru gestionarea erorilor: folosirea blocurilor try i catch. n scrierea codului,
programatorul va separa acele instruciuni care sunt sigure (adic nu pot fi generatoare de excepii), de cele care sunt
susceptibile s conduc la erori. Partea de program care poate genera excepii o vom plasa ntr-un bloc try, iar partea
corespunztoare tratrii excepiei, ntr-un bloc catch.
n cazul n care blocul try genereaz o excepie, Runtime ntrerupe execuia i caut un bloc catch apropiat care, n
funcie de tipul su s poat trata respectiva eroare. n cazul n care este gsit respectivul bloc catch programul continu
cu instruciunile din corpul catch. n cazul n care nu se gsete nici un catch corespunztor, execuia programului este
ntrerupt.
Avnd n vedere c ntr-un corp try pot s apar excepii diferite, n program pot exista mai multe blocuri
corespunztoare catch. Programatorul poate s-i compun modaliti proprii de aruncare a erorilor folosind
instruciunea throw: Limbajul C# permite ca la ieirea dintr-un bloc try s fie executate obligatoriu, n cazul n care
programatorul dorete acest lucru, anumite instruciuni. Pentru acest lucru, respectivele instruciuni vor fi plasate ntr-
un bloc finally.
Blocul finally este util fie pentru a evita scrierea unor instruciuni de mai multe ori, fie pentru a elibera resursele dup
prsirea excepiei.

92. POLIMORFISM. Polimorfismul parametric. Polimorfismul ad-hoc. Polimorfismul de motenire.

Polimorfismul este capacitatea unor entitide a lua forme diferite.


Limbajul C# admite trei tipuri de polimorfism:
- polimorfism parametric
Aceast form de polimorfism este preluat de la limbajele neobiectuale: Pascal, C. Prin aceast form
de polimorfism, o funcie va prelucra orice numr de parametri. Pentru aceasta se va folosi un parametru
de tip params.
- polimorfism ad-hoc
Acest tip de polimorfism se mai numete i suprancrcarea metodelor. Prin acest mecanism se pot defini n cadrul
unei clase mai multe metode, toate avnd acelai nume, dar cu tipul i numrul de parametri diferii. La compilare,
n funcie de parametri folosii la apel, se va apela o funcie sau alta.
- polimorfism de motenire
Polimorfismul de motenire mecanismul prin care o metod din clasa de baz este redefinit cu aceiai
parametri n clasele derivate. Selecia funciei se va realiza la rulare (legarea ntrziat (late binding, dynamic binding,
runtime binding)). n limbajul C++ este implementat cu ajutorul funciilor virtuale.

93. Modificatorii virtual i override. Modificatorul new. Metoda sealed.


Virtual este folosit in declararea unei metode sau a unei proprietati. Acestea se vor numi membri virtuali.
Implementarea unui membru virtual poate fi schimbata prin suprascrierea membrului intr-o clasa derivata.

Override se foloseste pentru a modifica o metoda sau o proprietate si furnizeaza o noua implementare a unui
membru mostenit dintr-o clasa de baza. Metoda de baza suprascrisa si metoda de suprascriere trebuie sa aiba aceeasi
signatura ( tip si numar de parametri ).

Implicit, metodele nu sunt virtuale. Nu se pot suprascrie metodele care nu sunt virtuale.
Modificatorul new

n cazul n care se dorete ca o metod dintr-o clas derivat s aib aceeai semntur cu o metod dintr-o clas
de baz, dar s nu fie considerat o suprascriere a ei, vom folosi modificatorul new.

Exemplu:

class Baza
{
public virtual void Afis()
{
Console.WriteLine("Apelul functiei Afis din clasa de baza\n");
}
}
class Derivata : Baza
{
// !!! new

public new void Afis()


{
Console.WriteLine("Apelul functiei Afis din clasa derivata\n");
}
}

O metod avnd tipul override poate fi declarat sealed. n acest fel ea nu mai poate fi suprascris ntr-o clas
derivat.

94. CONCEPTE DE BAZ ALE PROGRAMRII VIZUALE.

Simplitatea: Interfaa trebuie s fie ct mai uor de neles i de nvat de ctre utilizator i s permit acestuia s
efectueze operaiile dorite n timp ct mai scurt. n acest sens, este vital culegerea de informaii despre utilizatorii finali
ai aplicaiei i a modului n care acetia sunt obinuii s lucreze.

Poziia controalelor: Locaia controalelor dintr-o fereastr trebuie s reflecte importana relativ i frecvena de
utilizare. Astfel, cnd un utilizator trebuie s introduc nite informaii unele obligatorii i altele opionale este
indicat s organizm controalele astfel nct primele s fie cele care preiau informaii obligatorii.

Consistena: Ferestrele i controalele trebuie s fie afiate dup un design asemntor (template) pe parcursul
utilizrii aplicaiei. nainte de a implementa interfaa, trebuie decidem cum va arta aceasta, s definim template-ul.

Estetica: Interfaa trebuie s fie pe ct posibil plcut i atrgtoare.

95. MEDIUL DE DEZVOLTARE VISUAL C# (INTERFEA).

Mediul de dezvoltare Microsoft Visual C# dispune de instrumente specializate de proiectare, ceea ce permite crearea
aplicaiilor n mod interactiv, rapid i uor. Pentru a construi o aplicaie Windows (FileNew Project) se selecteaz ca
template Windows Forms Application.
O aplicaie Windows conine cel puin o fereastr (Form) n care se poate crea o interfa cu utilizatorul aplicaiei.

Componentele vizuale ale aplicaiei pot fi prelucrate n modul Designer (Shift+F7) pentru a plasa noi obiecte, a le stabili
proprietile etc. Codul din spatele unei componente vizuale este accesibil n modul Code (F7).
n fereastra Solution Explorer sunt afiate toate fiierele pe care C# 2008 Express Edition le-a inclus n proiect. Form1.cs
este formularul creat implicit ca parte a proiectului. Fiierul Form1.cs conine un formular (fereastra Form1 derivata din
clasa Form) care este reprezentat n formatul Design (Form1.cs[Design]), adic ntr-un format in care se poate executa
proiectare vizual, prin inserarea controalelor necesare selectate din fereastra Toolbox, care se activeaz atunci cnd
este atins cu mouse-ul. Fiierul Form1.cs poate fi vzut ca fiier text surs prin selectarea lui n fereastra Solution
Explorer, clic dreapta cu mouse-ul i selecia opiunii View Code.

Fereastra Properties (Ctrl+W,P) este utilizat pentru a schimba proprietile obiectelor.

Toolbox (Ctrl+W,X) conine controale standard drag-and-drop i componente utilizate n crearea aplicaiei Windows.
Controalele sunt grupate n categoriile logice din imaginea alturat. Ferestrele care sunt afiate in fereastra principal
se pot stabili prin selecie din meniul View.
La crearea unei noi aplicaii vizuale, Microsoft Visual C# 2008 Express Edition genereaz un spaiu de nume care conine
clasa static Program, cu metoda static ce constituie punctul de intrare (de lansare) a aplicaiei:

static void Main()

{ ...

Application.Run(new Form1());

Clasa Application este responsabil cu administrarea unei aplicaii Windows, punnd la dispoziie proprieti pentru a
obine informaii despre aplicaie, metode de lucru cu aplicaia i altele. Toate metodele i proprietile clasei
Application sunt statice. Metoda Run creeaz un formular implicit, aplicaia rspunznd la mesajele utilizatorului pn
cnd formularul va fi nchis. Compilarea modulelor aplicaiei i asamblarea lor ntr-un singur fiier executabil se
realizeaz cu ajutorul opiunilor din meniul Build, uzual fiind Build Solution (F6).

Odat implementat, aplicaia poate fi lansat, cu asisten de depanare sau nu (opiunile Start din meniul Debug). Alte
faciliti de depanare pot fi folosite prin umrirea pas cu pas, urmrirea pn la puncte de ntrerupere etc. (celelalte
opiuni ale meniului Debug).

Ferestre auxiliare de urmrire sunt vizualizate automat n timpul procesului de depanare, sau pot fi activate din
submeniul Windows al meniului Debug.

Proiectarea vizual a formularului se poate face insernd controale selectate din fereastra de instrumente (Toolbox) i
setnd proprietile acestora.

96. ELEMENTELE POO N CONTEXT VIZUAL.

Elementele programarii orientate pe obiecte sunt pe larg utilizate si in contextul vizual chiar daca nu sunt deodata
sesizabile.Exemplul perfect este insasi managementul unui proiect WindowsForm in C#.Dupa cum ne amintim pe
ecranul aplicatiei putem gasi mai multe elemente daca e sa le analizam atunci putem vedea elementele POO.Insasi
fereastra SolutionExplorer ce la prima vedere contine doar codul nostru , in realitate reprezinta un organizator de fisiere
ce contin clasele , formele etc (formele apropo sunt iarasi obiecte , deci iarasi vine vorba despre POO).Cel mai
reprezentative elemente sunt Toolboxul si Proprietatile.Din Toolbox putem selecta diferite obiecte ce le putem aranja
dupa dorinta in fereastra noastra(asa numita forma) , iar la general vobind n Toolbox exist toate tipurile de controale
care i sunt necesare unui programator pentru a realiza o aplicaie. Cele mai multe controale sunt obiecte de clase
derivate din clasa System.Windows.Forms.Control. Datorit acestui fapt multe dintre proprietile i evenimentele
diverselor controale vor fi identice. Fereastra Properties, din interfaa mediului de programare, vom observa c va
conine att proprietile ct i evenimentele ataate controalelor. Proprietile controalelor, sunt motenite sau
supranscrise din clasa de baz Control.
In acest mod vedem ca Programarea vizuala este nu altceva decit aceeasi programare orientata peobiecte doar ca
simplificata si cu mult mai accesibila.

97. Barele de instrumente

98. CONSTRUIREA INTERFEEI UTILIZATOR. Ferestre. Controale


Ferestre

Spaiul Forms ne ofer clase specializate pentru: creare de ferestre sau formulare (System.Windows.Forms.Form), elemente
specifice (controale) cum ar fi butoane (System.Windows.Forms.Button), casete de text (System.Windows.Forms.TextBox)
etc.

Proiectarea unei ferestre are la baz un cod complex, generat automat pe msur ce noi desemnm componentele i
comportamentul acesteia. n fapt, acest cod realizeaz: derivarea unei clase proprii din System.Windows.Forms.Form, clas
care este nzestrat cu o colecie de controale (iniial vid). Constructorul ferestrei realizeaz instanieri ale claselor Button,
MenuStrip,

Timer etc. (orice plasm noi n fereastr) i adaug referinele acestor obiecte la colecia de controale ale ferestrei. Dac
modelul de fereastr reprezint ferestra principal a aplicaiei, atunci ea este instaniat automat n programul principal
(metoda Main). Dac nu, trebuie s scriem noi codul care realizeaz instanierea. Clasele derivate din Form motenesc o serie
de proprieti care determin atributele vizuale ale ferestrei (stilul marginilor, culoare de fundal, etc.), metode care
implementeaz anumite comportamente (Show, Hide, Focus etc.) i o serie de metode specifice (handlere) de tratare a
evenimentelor (Load, Click etc.). O fereastr poate fi activat cu form.Show() sau cu form.ShowDialog(), metoda a doua
permind ca revenirea n fereastra din care a fost activat noul formular s se fac numai dup ce noul formular a fost nchis
(spunem c formularul nou este deschis modal). Un propietar este o fereastr care contribuie la comportarea formularului
deinut. Activarea propietarului unui formular deschis modal va determina activarea formularului deschis modal. Cnd un nou
formular este activat folosind form.Show() nu va avea nici un deintor, acesta stabilinduse direct : Formularul deschis modal
va avea un proprietar setat pe null. Deintorul se poate stabili

setnd proprietarul nainte s apelm Form.ShowDialog() sau apelnd From.ShowDialog() cu proprietarul ca argument.

Vizibilitatea unui formular poate fi setat folosind metodele Hide sau Show. Pentru a ascunde un formular putem folosi :

this.Hide(); // setarea propietatii Visible indirect sau StartPosition determin poziia ferestrei atunci cnd aceasta apare
prima dat. Poziia poate fi setat Manual, sau poate fi centrat pe desktop (CenterScreen), stabilit de Windows, formularul
avnd dimensiunile i locaia stabilite de programator (WindowsDefaultLocation) sau Windows-ul va stabili dimensiunea
iniial i locaia pentru formular (WindowsDefaultBounds) sau, centrat pe formularul care l-a afiat (CenterParent) atunci
cnd formularul va fi afiat modal. Location (X,Y) reprezint coordonatele colului din stnga sus al formularului relativ la
colul stnga sus al containerului. (Aceast propietate e ignorat dac StartPosition = Manual). Micarea formularului ( i
implicit schimbarea locaiei) poate fi tratat n evenimentele Move i LocationChanged . Locaia formularului poate fi
stabilit relativ la desktop astfel: Size (Width i Height) reprezint dimensiunea ferestrei. Cnd se schimb propietile
Width i Height ale unui formular, acesta se va redimensiona automat, aceast redimensionare fiind tratat n evenimentele
Resize sau in SizeChanged. Chiar dac propietatea Size a formularului indic dimensiunea ferestrei, formularul nu este n
totalitate responsabil pentru desenarea ntregului coninut al su. Partea care este desenat de formular mai este denumit i
Client Area. Marginile, titlul i scrollbar-ul sunt desenate de Windows. MaxinumSize i MinimumSize sunt utilizate pentru
a restriciona dimensiunile unui formular. ControlBox precizeaz dac fereastra conine sau nu un icon, butonul de
nchidere al ferestrei i meniul System (Restore,Move,Size,Maximize,Minimize,Close). HelpButton-precizeaz dac butonul
va aprea sau nu lng butonul de nchidere al formularului (doar dac MaximizeBox=false, MinimizeBox=false). Dac
utilizatorul apas acest buton i apoi apas oriunde pe formular va aprea evenimentul HelpRequested (F1). Icon
reprezint un obiect de tip *.ico folosit ca icon pentru formular.
MaximizeBox i MinimizeBox precizeaz dac fereastra are sau nu butonul Maximize i respectiv Minimize Opacity
indic procentul de opacitate ShowInTaskbar precizeaz dac fereastra apare in TaskBar atunci cnd formularul este
minimizat. SizeGripStyle specific tipul pentru Size Grip (Auto, Show, Hide). Size grip (n colul din dreapta jos) indic
faptul c aceast fereastr poate fi redimensionat. TopMost precizeaz dac fereastra este afisat n faa tuturor celorlalte
ferestre. TransparencyKey identific o culoare care va deveni transparent pe form. Definirea unei funcii de tratare a
unui eveniment asociat controlului se realizeaz prin selectarea grupului Events din ferestra Properties a controlului respectiv
i alegerea evenimentului dorit. Dac nu scriem nici un nume pentru funcia de tratare, ci efectum dublu clic n csua
respectiv, se genereaz automat un nume pentru aceast funcie, innd cont de numele controlului i de numele
evenimentului (de exemplu button1_Click). Dac n Designer efectum dublu clic pe un control, se va genera automat o funcie
de tratare pentru evenimentul implicit asociat controlului (pentru un buton evenimentul implicit este Clic, pentru TextBox este
TextChanged, pentru un formular Load etc.). Printre evenimentele cele mai des utilizate, se numr :

Load apare cnd formularul este pentru prima data ncrcat n memorie.

FormClosed apare cnd formularul este nchis.

FormClosing apare cnd formularul se va inchide ca rezultat al aciunii utilizatorului asupra butonului Close (Dac se
seteaz CancelEventArgs.Cancel =True atunci se va opri nchidereaformularului).

Activated apare pentru formularul activ.

Deactivate apare atunci cnd utilizatorul va da clic pe alt formular al aplicatiei.

Controale

Unitatea de baz a unei interfee Windows o reprezint un control. Acesta poate fi gzduit de un container ce poate fi un
formular sau un alt control. Un control este o instan a unei clase derivate din System.Windows.Forms i este reponsabil cu
desenarea unei pri din container. Visual Studio .NET vine cu o serie de controale standard, disponibile n Toolbox. Aceste
controale pot fi grupate astfel: Controale form. Controlul form este un container. Scopul su este de a gzdui alte controale.
Folosind proprietile, metodele i evenimentele unui formular, putem personaliza programul nostru. n tabelul de mai jos vei
gsi o list cu controalele cel mai des folosite i cu descrierea lor. Exemple de folosire a acestor controale vor urma dup
explicarea proprietilor comune al controalelor i formularelor.

Button Sunt folosite pentru a executa o secven de instruciuni n momentul activrii lor de ctre utilizator

calendar MonthCalendar Afieaz implicit un mic calendar al lunii curente. Acesta poate fi derulat i nainte i napoi la
celelalte luni calendaristice.

caset de validare CheckBox Ofer utilizatorului opiunile : da/nu sau include/exclude

etichet Label Sunt folosite pentru afiarea etichetelor de text, i a pentru a eticheta controalele.

caset cu list ListBox Afieaz o list de articole din care utilizatorul poate alege.

imagine PictureBox Este folosit pentru adugarea imaginilor sau a altor resurse de tip bitmap.

pointer Pointer Este utilizat pentru selectarea, mutarea sau redimensionarea unui control.

buton radio RadioButton Este folosit pentru ca utilizatorul s selecteze un singur element dint-un grup de selecii.

caset de text TextBox Este utilizat pentru afiarea textului generat de o aplicaie sau pentru a primi datele introduse de la
tastatur de ctre utilizator.
99. Proprieti comune ale controalelor i formularelor. Metode i evenimente.

Proprietatea Text Aceast proprietate poate fi setat n timpul proiectrii din fereastra Properties, sau programatic,
introducnd o declaraie n codul programului.

Proprietile ForeColor i BackColor. Prima proprietate enunat seteaz culoare textului din formular, iar cea de a doua
seteaz culoarea formularului. Toate acestea le putei modifica dup preferine din fereastra Properties.

Proprietatea AutoSize folosit la controalele Label i Picture, decide dac un control este redimensionat automat, pentru a-
i cuprinde ntreg coninutul.

Proprietatea Enabled determin dac un control este sau nu activat ntr-un formular.

Proprietatea Visible seteaz vizibilitatea controlului.

Proprietatea Width and Height permite setarea nlimii i a limii controlului.

Metode i evenimente

Un eveniment este un mesaj trimis de un obiect atunci cnd are loc o anumit aciune. Aceast actiune poate fi: interaciunea
cu utilizatorul (mouse click) sau interaciunea cu alte entiti de program. Un eveniment (event) poate fi apsarea unui buton,
o selecie de meniu, trecerea unui anumit interval de timp, pe scurt, orice ce se intampl n sistem i trebuie s primeasc un
raspuns din partea programului. Evenimentele sunt proprieti ale clasei care le public. Cuvantul-cheie event contoleaz cum
sunt accesate aceste proprieti.

Metodele Show() i Close(). Evenimentul Click

Metoda Dispose()

Metodele Clear() i Add()

Metoda ShowDialog()

100. Obiecte grafice. Validarea informaiilor de la utilizator. MessageBox. Interfa definit de ctre utilizator.

Spaiul System.Drawing conine tipuri care permit realizarea unor desene 2D i au rol deosebit n proiectarea interfeelor
grafice.

Un obiect de tip Point este reprezentat prin coordonatele unui punct ntr-un spaiul bidimensional

Putem construi un obiect de tip Point pentru a redimensiona un alt obiect.

Structura Color conine date, tipuri i metode utile n lucrul cu culori. Fiind un tip valoare (struct) i nu o clas, aceasta
conine date i metode, ns nu permite instaniere, constructori, destructor, motenire.

nainte ca informaiile de la utilizator s fie preluate i transmise ctre alte clase, este necesar s fie validate. Acest aspect este
important, pentru a preveni posibilele erori. Astfel, dac utilizatorul introduce o valoare real (float) cnd aplicaia ateapt un
ntreg (int), este posibil ca aceasta s se comporte neprevzut abia cteva secunde mai trziu, i dup multe apeluri de metode,
fiind foarte greu de identificat cauza primar a problemei.

Datele pot fi validate pe msur ce sunt introduse, asociind o prelucrare unuia dintre handlerele asociate evenimentelor la
nivel de control (Leave, Textchanged, MouseUp etc.)

n unele situaii (de exemplu atunci cnd valorile introduse trebuie s se afle ntr-o anumit relaie ntre ele), validarea se face
la sfritul introducerii tuturor datelor la nivelul unui buton final sau la nchiderea ferestrei de date.
MessageBox este o clas din spaiul de nume System.Windows.Forms, derivat din clasa Object Show este o metod
static din clasa MessageBox n momentul n care se apas butonul OK, fereastra cu acest mesaj se nchide, metoda Show
cednd controlul.

Metoda Show are mai multe forme n clasa MessageBox, fiind supradefinit. Apelul acestei funcii se va face n funcie de
parametri. S considerm acum apelul funciei Show cu doi parametri: al doilea parametru se va referi la textul care apare pe
bara de titlu n fereastr de mesaje:

Sunt multe aplicaii n care, poate, dorim s ne realizm o interfa proprie, ca form, n locul celei dreptunghiulare propus de
Visual C#.

n primul rnd trebuie s ne desenm propria fereastr de viitoare aplicaii. Pentru aceasta vom folosi, de exemplu, aplicaia
Paint.

Desenm o figur geometric care va constitui viitoarea noastr fereastr. Presupunem c dorim ca fereastra s aib forma de
oval. Colorm ovalul cu o culoare dorit, iar pentru fundal alegem orice culoare, reinnd codul ei RGB Salvm desenul cu
extensia gif: oval.gif S trecem acum la Visual C#. Alegem: File | New Project | Windows Forms Application, iar ca nume
InterfataUtilizator Aduc controlul PictureBox. Din PictureBox Task aleg imaginea care s apar: oval.jpg iar la Size Mode
aleg StretchImage astfel nct imaginea s fie toat n PictureBox Deformez PictureBox-ul astfel nct ovalul desenat s
ocupe o suprafa care s corespund esteticii programatorului