Documente Academic
Documente Profesional
Documente Cultură
1
TEMA: Aplicaii Windows
Scopul lucrrii: Studierea bazelor i principiilor de creare a aplicaiilor
Windows
Noiuni teoretice
Windows este o interfa grafic cu utilizatorul (GUI - graphical user
interface), numit uneori i interfa vizual" sau mediu grafic cu ferestre"
(graphical windowing environment"). 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
(WYSIWYG - what you see is what you get).
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.
Apelurile de funcii
Windows asigur suportul pentru mai mult de o mie de apeluri de funcii
pe care le pot folosi aplicaiile. Fiecare funcie Windows are un nume
sugestiv, scris att cu majuscule, ct i cu minuscule, cum ar fi
CreateWindow. Aceast funcie, aa cum probabil v-ai dat seama, creeaz o
fereastr.
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
gndii la obiectul pe care l vei folosi cel mai mult n Windows - obiectul
care d numele sistemului de operare, obsedanta fereastr".
Aa cum am menionat mai devreme, ferestrele sunt nite suprafee
dreptunghiulare de pe ecran. O fereastr primete intrri de la tastatur sau de
la mouse i afieaz rezultate n zona proprie de pe suprafaa ecranului.
Fereastra unei aplicaii conine, de obicei, bara de titlu a programului,
meniul, chenarul de dimensionare i, eventual, barele de derulare. Casetele
de dialog sunt ferestre adiionale. Mai mult, suprafaa unei casete de dialog
conine ntotdeauna cteva ferestre suplimentare, numite ferestre
descendent" (child windows"). Ferestrele descendent apar sub forma
butoanelor de apsare, a butoanelor radio, a casetelor de validare, a
cmpurilor pentru introducerea textului, casetelor-list i a barelor de
derulare.
Utilizatorul vede ferestrele ca obiecte pe ecran i poate aciona direct
asupra lor, apsnd un buton sau manipulnd o bar de derulare. Fereastra
recepioneaz inteniile utilizatorului sub forma unor mesaje". De asemenea,
ferestrele folosesc mesaje pentru comunicarea cu alte ferestre.
Atunci cnd se spune c sistemul de operare trimite programului un
mesaj" se are n vedere c 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").
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.
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.
O fereastr este creat ntotdeauna pe baza unei clase de fereastr".
Clasa specific procedura de fereastr care prelucreaz mesajele trimise ctre
fereastr. Folosirea unei clase de fereastr permite ca pe baza aceleiai clase
3
hlnstance,
(variabil handle a unei ferestre). Orice fereastr din Windows are o variabil
handle. Programul folosete variabila handle pentru indicarea ferestrei. Multe
funcii Windows au un parametru hwnd, care specific fereastra la care se
refer funcia respectiv. Dac un program creeaz mai multe ferestre,
fiecare are o variabil handle diferit. Variabila handle a unei ferestre este
una dintre cele mai importante variabile folosite n Windows.
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.
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;
8
10
11
12
Contextul de dispozitiv
Atunci cnd vrei s desenai la un dispozitiv de ieire grafic
(cum ar fi ecranul sau imprimanta) trebuie s obinei mai nti o
variabil handle a contextului de dispozitiv (DC - device context).
Variabila handle este apoi inclus ca parametru n apelul unei
funcii GDI, identificnd dispozitivul Ia care vrei s desenai.
Contextul de dispozitiv conine mai multe atribute curente, care
specific modul de lucru al funciilor GDI pentru dispozitivul
respectiv. Aceste atribute permit ca la apelarea funciilor GDI s
fie specificate numai coordonatele de nceput sau dimensiunea, nu
i toate celelalte informaii de care sistemul de operare are nevoie
pentru desenarea obiectelor pe dispozitivul folosit. Atunci cnd
dorii s modificai unul dintre aceste atribute ale contextului de
dispozitiv, apelai o funcie specializat.
Obinerea variabilei handle a contextului de dispozitiv
Sistemul de operare Windows v pune la dispoziie mai multe
metode pentru obinerea variabilei handle a contextului de
dispozitiv. Dac obinei o variabil handle a contextului de
dispozitiv n timpul prelucrrii unui mesaj, ar trebui s tergei
aceast variabil nainte de ieirea din procedura de fereastr.
Dup ce este tears, variabila handle nu mai poate fi folosit (nu
mai este valid).
Cea mai cunoscut metod de obinere i de tergere a
variabilei handle a contextului de dispozitiv implic folosirea
funciilor BeginPaint i EndPaint n timpul prelucrrii mesajului
WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
16
Figura
Dreptunghi cu coluri drepte
Elips
Dreptunghi cu coluri rotunjite
Arc pe circumferina unei elipse, avnd
capetele unite printr-o coard
Suprafa de forma unei felii de plcint,
reprezentnd un segment de elips.
24
Polygon
PolyPolygon
27
sau instruciunea:
PolyBezierTo (hide, pt, iCount) ;
30
are un 1 n bitul cel mai puin semnificativ dac tasta Caps Lock
este activ.
Dac ntr-adevr avei nevoie de starea curent a unei taste,
putei s folosii funcia GetAsyncKeyState.
Utilizarea mesajelor de acionare a tastelor
Ideea unui program care s obin informaii despre toate
aciunile exercitate asupra tastelor este bun. Cu toate acestea,
majoritatea programelor Windows ignor cea mai mare parte a
acestor
mesaje.
Mesajele
WM_SYSKEYUP
i
WM_SYSKEYDOWN sunt folosite pentru funciile sistemului,
aa c nu este nevoie s le interceptai. De asemenea, dac
prelucrai mesajele WM_KEYDOWN, de obicei putei s ignorai
mesajele WM_KEYUP.
n general, programele pentru Windows folosesc mesajele
WM_KEYDOWN pentru tastele care nu genereaz caractere. Dei
s-ar putea s v vin ideea s folosii mesajele pentru acionri de
taste n combinaie cu informaiile despre tastele de modificare
(furnizate de funcia GetKeyState) ca s transformai mesajele
pentru acionri de taste n mesaje pentru caractere, nu facei acest
lucru. Vei avea probleme datorit diferenelor ntre tastaturile
36
Caractere non-sistem
Caractere sistem
Caractere
Caractere
moarte"
WM_CHAR
WM_SYSCHAR
WM_DEADCHAR
WM_SYSDEADCHAR
case WM_KEYDOWN:
switch(wParam)
{
case x:
// x
//
[ ]
break;
...
}
return 0;
...
39