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