Sunteți pe pagina 1din 4

1. Care este sarcina principala a procedurii de fereastra?

O procedura de fereastra este o functia care primeste si prelucreaza toate mesajele trimise la fereastra.O
procedură de fereastră poate avea orice nume (cu condiţia ca numele respectiv să nu existe deja). Un
program pentru Windows poate conţine mai multe proceduri de fereastră. O procedură de fereastră este
întotdeauna asociată unei clase de fereastră, înregistrată cu ajutorul funcţiei RegisterClassEx.

2. Pe baza la ce se creeaza o fereastra?


O fereastră este creată întotdeauna pe baza unei „clase de fereastră". Clasa specifică procedura de
fereastră care prelucrează mesajele trimise către fereastră. Folosirea unei clase de fereastră permite ca
pe baza aceleiaşi clase să se creeze mai multe ferestre care, ca urmare, folosesc aceeaşi procedură de
fereastră. De exemplu, toate butoanele din toate programele pentru Windows sunt create pe baza
aceleiaşi clase de fereastră. Această clasă are o procedură de fereastră (aflată într-una dintre
bibliotecile cu legături dinamice ale sistemului de operare) care prelucrează mesajele trimise către
ferestrele butoanelor.

3. Descrieti campurile clasei de fereastra.


cbSize - reprezintă dimensiunea structurii
wndclass.style = CS_HREDRAW | CS_VREDRAW; combină doi identificatori pentru „stilul de clasă"
wndclass.lpfnWndProc = WndProc - Această instrucţiune stabileşte ca procedură de fereastră funcţia
WndProc. Această procedură va prelucra toate mesajele trimise către toate ferestrele create pe baza acestei
clase de fereastră. (lpfn - pointer de tip long la o funcţie)
(lpfnWndProc) este adresa procedurii de fereastră folosită pentru toate ferestrele create pe baza acestei
clase.
wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;
rezervă un spaţiu suplimentar în structura clasei şi în structura ferestrei, păstrată în interiorul sistemului de
Windows
wndclass.hInstance = hinstance; variabila handle a instanţei (care este chiar unul dintre parametrii funcţiei
Window)
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
definesc o pictogramă pentru ferestrele create pe baza acestei clase.
LoadIcon returnează o variabilă handle a acestei pictograme
wndclass.hCursor = LoadCursor (NULL, IDC_ ARROW); Funcţia LoadCursor încarcă un cursor
predefinit pentru mouse
Prefixul hbr al numelui hbrBackground vine de la „handle to a brush" („variabilă handle a unei pensule").
Funcţia GetStockObject returnează o variabilă handle a unei pensule albe:
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL; specifică meniul ferestrei. Dacă programul nu are nici un meniu,
valoarea acestui câmp este NULL
In variabila szAppName este stocat şirul de caractere „Window": wndclass.IpszClassName = szAppName;

4. Ce este o variabila handle?


Orice fereastră din Windows are o variabilă handle. O variabila handle este o variabila care se foloseste
pentru indicarea ferestrei. Multe funcţii Windows au un parametru hwnd, care specifică fereastra la care se
referă funcţia 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.

5. Ce se intampla cu mesajele nedescrise în procedura de fereastra, dar plasate în coada de mesaje?


Orice mesaj pe care procedura de fereastră nu-l prelucrează este transmis unei funcţii Windows numită
DefWindowProc. Valoarea returnată de funcţia DefWindowProc trebuie să fie returnată şi de procedura de
fereastră.

6. Descrieti functiile utilizate î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 - obţine 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 - afişează o fereastră pe ecran.
UpdateWindow - cere unei ferestre să se redeseneze.
GetMessage - preia un mesaj din coada de mesaje.
TranslateMessage - converteşte unele dintre mesajele de la tastatură.
DispatchMessage - trimite un mesaj către o procedură de fereastră.
PlaySound - redă un fişier de sunet.
BeginPaint - iniţiază o operaţie de desenare a ferestrei.
GetClientRect - obţine dimensiunile zonei client a ferestrei.
DrawText - afişează un text.
EndPaint - încheie o operaţie de desenare.
PostQuitMessage - inserează un mesaj de încheiere în coada de aşteptare.
DefWindowProc - execută operaţiile prestabilite de prelucrare a mesajelor.

1
Listingul programului
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){
static char szAppName[] = "Window";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
//#Inregistrarea clasei ferestrei
wndclass.cbSize = sizeof(wndclass); //cbSize reprezinta dimensiunea structurii
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_INFORMATION);
wndclass.hCursor = LoadCursor(NULL, IDC_HAND);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //GetStockObject obtine
un obiect grafic (in acest caz o pensula folosita pentru desenarea fondului ferestrei)
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_INFORMATION);
if(!RegisterClassEx(&wndclass)){ //inregistreaza o clasa de fereastra pentru fereastra
programului
MessageBox(NULL, "Inregistrarea ferestrei a esuat!", "Eroare!",
MB_ICONEXCLAMATION | MB_OK);
return 0; }
//#Crearea ferestrei
hwnd = CreateWindow(szAppName, // numele clasei de fereastra (creaza o
fereastra pe baza unei clase de fereastra )
"Laborator nr.1", // titlul ferestrei
WS_TILEDWINDOW, // stilul ferestrei
CW_USEDEFAULT, // pozitia initiala pe axa x
CW_USEDEFAULT, // pozitia initiala pe axa y
CW_USEDEFAULT, // dimensiunea initiala pe axa x
CW_USEDEFAULT, // dimensiunea initiala pe axa y
NULL, // variabila handle a ferestrei parinte
NULL, // variabila handle a meniului
hInstance, // variabila handle a instantei programului
NULL); // parametri de creare
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
//#Bucla de mesaje
while (GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
//#Procedura ferestrei
switch (iMsg){
case WM_CREATE :
PlaySound ("sound.wav", NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Lucrarea de laborator a studentului grupei TI-154 Popusoi
Victor", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam); }
2
Rezultatele obtinute

Concluzii

In aceasta lucrare de laborator s-a creat o aplicatie windows, care afiseaza la ecran “Lucrarea de
laborator a studentului … ” in asa fel incit mesajul la redimensionarea ferestrei trebuie sa fie
afisat in central zonei client. S-a facut cunostiinta cu noi functii de creare a ferestrei, de afisare,
de desenare, de adaugare a unui sunet atunci cind ne apare fereastra la rularea programului etc.

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