Sunteți pe pagina 1din 12

Universitatea Tehnica a Moldovei

Lucrare de laborator nr. 1

Tema : Aplicatii Windows

Efectuat
Studentul gr. . TI-124 :
Verificat
Prof.univ.

Casianenco Victor

Cojocaru Svetlana

Chisinau 2014
1.Tema : Aplicatii Windows

2.Scopul lucrarii :

Studierea bazelor i principiilor de creare a aplicaiilor Windows

3.Listingul pogramului :
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Procedura de fereastra cu parametri
sai//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdLine)
//parametri functiei WinMain//
{
HWND hMainWnd;
char classname[] = "MyClass";
MSG msg; //ciclul de mesaje//
WNDCLASSEX wc; //aceasta finctie accepta un singur parametru Structura WNDCLASSEX este
definit n fiierele antet din Windows //
wc.cbSize
= sizeof(wc); //acest cinp reprezinta denumirea structurii//
wc.style
= CS_HREDRAW|CS_VREDRAW; //INSTRUCTIUNEA:
wndclass.style=CS_HREDRAW|CS_VREDRAW;combin doi identificatori pentru stilul de clas aici sunt 2
idntificatori care raspund de stilul de fereastra//
wc.lpfnWndProc
= WndProc;//(INSTRUCTIUNEA DE INITIALIZARE PENTRU WNDCLASEX aici este
descrisa adresa procedurii de fereastr folosit pentru toate ferestrele create pe baza acestei clase//
wc.cbClsExtra
= 0; //aceste 2 clase rezerv un spaiu suplimentar n structura clasei i n
structura ferestrei, pstrat n interiorul sistemului de Windows//
wc.cbWndExtra
= 0;
wc.hInstance
= hInstance;//aici se descrie o variabila handle a instanei) (care este chiar unul
dintre parametrii funciei WinMain//
wc.hIcon
= LoadIcon(NULL, IDI_APPLICATION);//aici se defineshte o pictograma pentru
ferestrele create//
wc.hCursor
= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground
= (HBRUSH)GetStockObject(WHITE_BRUSH);//ACEASTA nseamn c fondul
zonei client a ferestrei va fi colorat cu alb//
wc.lpszMenuName
= NULL;//se are invedere ca fereastra nu are nici un meniu//
wc.lpszClassName
= classname; //numele programului//
wc.hIconSm
= LoadIcon(NULL, IDI_APPLICATION);//definesc o pictogram pentru
ferestrele create pe baza acestei clase//

if(!RegisterClassEx(&wc)) //nregistreaz o clas de fereastr pentru fereastra programului)(accepta


doar un singur parametru de tip pointr//
{
MessageBox(NULL, "Cannot register class", "Error", MB_OK);
return 0;
}
hMainWnd = CreateWindow(classname, "Windows - Made by TI-124 M.Rosu",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, //aici se descrie crearea stilului ferestrei si folosirea
valorilor prestabilite//
CW_USEDEFAULT, 0, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, NULL);//aici sunt mai
multe variabile handle//
if(!hMainWnd)
{
MessageBox(NULL, "Cannot create window", "Error", MB_OK);
return 0;
}
ShowWindow(hMainWnd, nCmdLine); //Afisarea ferestreai pe ecran//
while(GetMessage(&msg, NULL, 0, 0)) //FUNCTIA PREIA UN MESAJ DIN COADA DE MESAJE//
{
TranslateMessage(&msg);//ACEASTA FUNCTIE CONVERTESTE UNILE MESAJE DE LA TASTATURA//
DispatchMessage(&msg);//ACEASTA FUNCTIE TRIMITE UN MESAJ CATRE O PROCEDURA DE
FEREASTRA//
}
return msg.wParam;//Variabila msg este o structur de tip MSG//
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)//AICI SE
DEFINESHTE PROCEDURA DE FEREASTRA//
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
switch (uMsg) //AICI SE DETERMINA CA MESAJU A FOST PRIMIT i SE STABILESTE MODUL
DE PRELUCRARE A FIECARUI MESAJ//
{
case WM_PAINT: //DESENEAZA CEVA IN ZONA CLIENT//
hDC = BeginPaint(hWnd, &ps);//INITIAZA O OPERATIE DE DESENARE A
FERESTREI//
GetClientRect(hWnd, &rect);//OBTINE DIMENSIUNILE ZONEI CLIENT A FERESTREI//
DrawText(hDC, (LPCSTR)"Lucrarea de laborator nr.1 la PW a studentului
Casianenco Victor grupa TI-124", -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd, &ps);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;

4.Rezultatele de executie :

5.Concluzie :

La aceasta lucrare de laborator am studiat bazele i principiile de creare a aplicaiilor


Windows.Am facut cunotina cu unele funcii din acest domeniu i anume de creeare a ferestrelor
i de prelucrare a evenimentelor care au loc cu ferestrele.

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 Windows, aa cum este, de exemplu, 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 (DLL - dynamic link libraries).Mai jos sunt prezentate careva funcii
Windows pentru a simplifica crearea unei aplicaii Windows:
o
o
o
o
o
o
o
o
o
o

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.

o
o
o
o
o
o
o

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.

Aceste funcii sunt documentate n cri i n sursele incluse de compilator i sunt declarate n diferite
fiiere antet incluse n fiierul WINDOWS.H.
Programarea sub Windows este un tip de programare orientat pe obiecte (OOP -object-oriented
programming). Acest lucru devine evident dac v gndii la obiectul pe care l vei folosi cel mai mult n
Windows - obiectul care d numele sistemului de operare, obsedanta fereastr".

nregistrarea clasei de fereastr


Clasa de fereastr identific procedura de fereastr care prelucreaz toate mesajele trimise ctre
fereastr. Atunci cnd creai o fereastr, definii i atributele suplimentare ale acesteia, care sunt unice
pentru fereastra respectiv.
Cele mai importante cmpuri ale clasei de fereastr sunt al treilea i penultimul. Penultimul cmp
conine numele clasei de fereastr (i n programele care creeaz o singur fereastr are, de obicei,
acelai nume ca i programul). 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.
Cmpul cbSize reprezint dimensiunea structurii. Instruciunea: wndclass.style = CS_HREDRAW |
CS_VREDRAW; combin doi identificatori pentru stilul de clas" (class style") folosind operatorul SAU
orientat pe bii din limbajul C. n fiierele antet din Windows sunt definii mai muli identificatori cu
prefixul CS_. Acestea sunt constante pe 32 de bii n care un singur bit are valoarea 1. Identificatorii
definii n acest fel sunt numii uneori identificatori pe bii". Acetia pot fi combinai cu ajutorul
operatorului SAU orientat pe bii din limbajul C.
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.
Al treilea cmp al structurii WNDCLASSEX este iniializat prin instruciunea:
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".
Urmtoarele dou instruciuni:

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.
Urmtorul cmp este variabila handle a instanei (care este chiar unul dintre parametrii funciei
WinMain):
wndclass.hInstance = hinstance;
Instruciunile:
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. (Atunci cnd ncrcai o pictogram proprie, acest parametru va
conine variabila handle a instanei programului.) Al doilea parametru este un identificator cu prefixul
IDI_ definit n fiierele antet din Windows. Pictograma IDI_APPLICATION este o mic imagine a unei
ferestre. Funcia LoadIcon returneaz o variabil handle a acestei pictograme. Nu ne intereseaz
valoarea real a acestei variabile, ci doar o stocm n cmpurile hIcon i hIconSm. Aceste cmpuri sunt
definite n structura WNDCLASSEX de tipul HICON (handle to an icon").
Instruciunea:
wndclass.hCursor = LoadCursor (NULL, IDC_ ARROW);
este foarte asemntoare cu cele dou instruciuni anterioare. 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 mouseului este afiat sub forma unei sgei.
Urmtorul cmp precizeaz culoarea fondului zonei client a ferestrelor create pe baza acestei clase.
Prefixul hbr al numelui hbrBackground vine de la handle to a brush" (variabil handle a unei pensule").
O pensul este un termen grafic care se refer la un model colorat de pixeli folosit pentru umplerea unei
suprafee. Windows are mai multe pensule standard (sau pensule de stoc").
Funcia GetStockObject returneaz o variabil handle a unei pensule albe:
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
Aceasta nseamn c fondul zonei client a ferestrei va fi colorat cu alb, ceea ce este un lucru obinuit.
Urmtorul cmp specific meniul ferestrei. Dac programul nu are nici un meniu, valoarea acestui cmp
este NULL:
wndclass.lpszMenuName = NULL;

n sfrit, clasei trebuie s i se dea un nume. Pentru programele mai mici, acesta poate fi chiar numele
programului, deci n variabila szAppName este stocat irul de caractere HelloWin":
wndclass.IpszClassName = szAppName;
nainte de a crea fereastra programului trebuie s nregistrai o clas de fereastr, apelnd
funciaRegisterClassEx. Funcia RegisterClassEx accept un singur parametru: un pointer la o structur
de tipul WNDCLASSEX. Structura WNDCLASSEX este definit n fiierele antet din Windows i
declarat n program n felul urmtor:
WNDCLASSEX wndclass ;
Dup ce ai definit cele 12 cmpuri ale structurii WNDCLASSEX apelai funcia RegisterClassEx:
RegisterClassEx (&wndclass) ;

Crearea terestrei
Atunci cnd creai o fereastr apelnd funcia Create Window, putei s specificai mai multe detalii
despre fereastra respectiv. n loc s foloseasc o structur de date, aa cum face
funcia RegisterClassEx, funciaCreateWindow cere ca toate informaiile s fie transmise ca parametri.
Iat un exemplu de apel al funciei CreateWindow:
hwnd =CreateWindow (szAppName,
"The Hello Program",

// numele clasei de fereastra

// 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,
hlnstance,

// variabila handle a meniului


// variabila handle a instanei
programului

NULL) ;

// parametri de creare

Parametrul notat cu numele clasei de fereastr" este szAppName, care conine irul de caractere
HelloWin" - numele clasei de fereastr pe care tocmai am nregistrat-o. n acest fel, fereastra este
asociat unei clase de fereastr.
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. n mod prestabilit, Windows poziioneaz
mai multe ferestre suprapuse succesive la o distan cresctoare pe vertical i pe orizontal fa de
colul din stnga-sus al ecranului. La fel, 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 printedescendent, 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. Putei s folosii acest parametru pentru adresarea unor date folosite ulterior n
program.
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. Multe
funcii Windows au un parametruhwnd, 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;
Variabila msg este o structur de tip MSG.
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.
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.

Procedura de fereastr
O procedur de fereastr poate avea orice nume (cu condiia ca numele respectiv s nu existe deja).
Un program pentru Windows poate conine mai multe proceduri de fereastr. O procedur de fereastr
este ntotdeauna asociat unei clase de fereastr, nregistrat cu ajutorul
funciei RegisterClassEx. Procedura de fereastr este definit ntotdeauna astfel:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam. LPARAM lParam)
Primul parametru este hwnd, variabila handle a ferestrei care recepioneaz mesajul. Aceasta este
aceeai variabil cu cea returnat de funcia CreateWindow. Pentru un program care creeaz o singur
fereastr aceasta este singura variabil handle cunoscut de program. Dac programul creeaz mai
multe ferestre pe baza aceleiai clase (i deci folosete aceeai procedur de fereastr),
atunci hwnd identific fereastra care primete mesajul.
Al doilea parametru este un numr (mai precis, un ntreg fr semn - UINT - pe 32 de bii) care
identific mesajul. Ultimii doi parametri (wParam, de tipul WPARAM si lParam, de tipul LPARAM)
furnizeaz mai multe informaii despre mesaj. Acetia sunt numii parametri de mesaj". Coninutul
acestor parametri este specific fiecrui tip de mesaj.

Prelucrarea mesajelor
Fiecare mesaj recepionat de o procedur de fereastr este identificat printr-un numr, acesta fiind
parametruliMsg al procedurii de fereastr. n fiierele antet din Windows sunt definii identificatori, cu
prefixul WM (window message"), pentru fiecare parametru de mesaje.
n general, programatorii Windows folosesc o construcie switch sau case ca s determine ce mesaje a
primit fereastra i s stabileasc modul de prelucrare a fiecrui mesaj. Atunci cnd prelucreaz un
mesaj, procedura de fereastr trebuie s returneze valoarea 0. Orice mesaj pe care procedura de
fereastr nu-l prelucreaz este transmis unei funcii Windows numit DefWindowProc. Valoarea
returnat de funcia DefWindowProc trebuie s fie returnat i de procedura de fereastr.
Mai jos sunt descrise dou mesaje cele mai des ntlnite n programele scrise pentru Windows.

Mesajul WM_PAINT
Unul din mesaje prelucrat de funcia WndProc este 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.

Cum poate s devin invalid o zon client? Atunci cnd fereastra este creat, ntreaga zon client a
ferestrei este invalid, deoarece programul nu a desenat nc nimic n fereastr. Primul mesaj
WM_PAINT (care apare, n mod normal, atunci cnd programul apeleaz funcia UpdateWindow din
WinMain) cere procedurii de fereastr s deseneze ceva n zona client.
Zona client devine invalid i atunci cnd redimensionai fereastra creatp de program. V amintii c
parametrul destil al structurii wndclass conine identificatorii CS_VREDRAW i CS_HREDRAW. Aceti
identificatori determin sistemul de operare Windows s invalideze ntreaga fereastr atunci cnd
aceasta i schimb dimensiunea i apoi s trimit un mesaj WM_PAINT ctre procedura de fereastr.
Dac micorai la o pictogram fereastra programului i apoi i refacei dimensiunea iniial, Windows
nu salveaz coninutul zonei client. ntr-un mediu grafic ar fi mult prea multe date de salvat. De aceea
Windows invalideaz fereastra. Procedura de fereastr primete mesajul WM_PAINT i reface
coninutul acesteia.
Atunci cnd mutai ferestrele astfel nct s se suprapun. Windows nu salveaz poriunea unei ferestre
care a fost acoperit de o alt fereastr. n schimb, atunci cnd fereastra respectiv este readus la
suprafa, poriunea anterior acoperit este invalidat. Procedura de fereastr primete un mesaj
WM_PAINT pentru redesenarea poriunii respective.
De fiecare dat cnd zona client devine invalid (aa cum se ntmpl atunci cnd modificai
dimensiunea ferestrei), funcia WndProc recepioneaz un mesaj WM_PAINT. WndProc obine noua
dimensiune a ferestrei i afieaz din nou textul n centrul acesteia.

1.
2.
3.
4.
5.

ntrebri de control:

Care este sarcina principal a procedurii de fereastr?


Pe baza la ce se creeaz o fereastr?
Descriei cmpurile clasei de fereastr.
Ce este o variabil handle?
Ce se ntmpl cu mesajele nedescrise n procedura de fereastr, dar plasate n coada de
mesaje?
6. Descriei funciile utilizate n program.

Raspunsuri:
1. Procedura de fereasta este o functie si pricipala sarcina a ei este de a PRIMI si de a
PRELUCRA toate mesajele trimise la fwereastra.
2. Odata inregistrata clasa ferestrei se poate crea o fereastra din aceasta clasa folosind functia
CreateWindowsEx.
3. Clasa de fereastr identific procedura de fereastr care prelucreaz toate mesajele trimise
ctre fereastr. Atunci cnd creai o fereastr, definii i atributele suplimentare ale acesteia, care
sunt unice pentru fereastra respectiv

4.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.
Cmpul cbSize reprezint dimensiunea structurii. Instruciunea: wndclass.style = CS_HREDRAW |
CS_VREDRAW; combin doi identificatori pentru stilul de clas" (class style") folosind operatorul
SAU orientat pe bii din limbajul C. n fiierele antet din Windows sunt definii mai muli identificatori
cu prefixul CS_. Acestea sunt constante pe 32 de bii n care un singur bit are valoarea 1.
Identificatorii definii n acest fel sunt numii uneori identificatori pe bii". Acetia pot fi combinai cu
ajutorul operatorului SAU orientat pe bii din limbajul C.
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.
Al treilea cmp al structurii WNDCLASSEX este iniializat prin instruciunea:
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".
Urmtoarele dou instruciuni:
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.
Urmtorul cmp este variabila handle a instanei (care este chiar unul dintre parametrii funciei
WinMain):
wndclass.hInstance = hinstance;

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