Sunteți pe pagina 1din 10

MINISTERUL EDUCAIEI I TINERETULUI AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICA A MOLDOVEI


Facultatea Calculatoare, Informatic i Microelectronic

RAPORT
LA LUCRAREA DE LABORATOR NR. 1
Disciplina : Programarea n Windows

TEMA: Applicaii Windows

A efectuat:

st.Gr. TI-122 Cobla Adrian

A verificat:

lector asistent Lisnic Inga

Chiinu 2014

Scopul lucrrii
De studiat bazele i principiile de creare a aplica iilor Windows

Sarcina propus
Creai o aplicaie Windows , n centrul zonei client al creia este afi at un mesaj Lucrarea de laborator a
studentului. La redimensionarea ferestrei, mesajul trebuie sa fie afi at n centrul zonei client.

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:

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.

Aceste funcii sunt documentate n cri i n sursele incluse de compilator i sunt declarate n diferite fiiere
antet incluse n fiierul WINDOWS.H.
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 mouse-ului 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 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 i declarat n
program n felul urmtor:
WNDCLASSEX wndclass ;
Dup ce ai definit cele 12 cmpuri ale structurii WNDCLASSEX apelai funcia RegisterClassEx:
RegisterClassEx (&wndclass) ;

Raspunsuri la intrebari:
1) Care este sarcina principal a procedurii 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. 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.
2) Pe baza la ce se creeaz o fereastr?

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 s se creeze mai multe ferestre care, ca urmare, folosesc aceeai procedur de fereastr. De exemplu,
toate butoanele din toate programele pentru Windows sunt create pe baza aceleiai clase de fereastr. Aceast
clas are o procedur de fereastr (aflat ntr-una dintre bibliotecile cu legturi dinamice ale sistemului de
operare) care prelucreaz mesajele trimise ctre ferestrele butoanelor.
3) Descriei cmpurile clasei de fereastr.
Cimpurile clasei de fereastra:
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); //
wcex.style = CS_HREDRAW | CS_VREDRAW; // stilul de clas" (class style")
wcex.lpfnWndProc

= (WNDPROC)WndProc; // adresa procedurii de fereastr

wcex.cbClsExtra = 0;// rezerv un spaiu suplimentar n structura clasei


wcex.cbWndExtra = 0;// rezerv un spaiu suplimentar n structura ferestrei
wcex.hInstance = hInstance; // variabila handle a instanei
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_L1PW);// defineste o pictogram
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);// ncarc un cursor predefinit pentru mouse,
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);// precizeaz culoarea fondului zonei
client a ferestrelor
wcex.lpszMenuName

= (LPCSTR)IDC_L1PW; //specific meniul ferestrei.

wcex.lpszClassName

= szWindowClass;// numele Clasei

wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);// defineste o pictogram

4) Ce este o variabil handle?


Orice fereastr din Windows are o variabil handle. O variabila handle este o variabila care se foloseste
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.
5) Ce se ntmpl cu mesajele nedescrise n procedura de fereastr, dar plasate n coada de mesaje?
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.
6) Descriei funciile utilizate n program.
Functiile utilizate:
Crearea ferestrei cu ajutorul funciei CreateWindow i respectiv introducerea din nou a parametrilor de baz
pentru crearea acesteia, mai jos este prezentat apelul funciei care este folosit n programul din anex:

hWnd = CreateWindow(szWindowClass,"FirstWindowApplication ", WS_OVERLAPPEDWINDOW,


CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
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

Parametrii functiei:

Dup executarea funciei CreateWindow, fereastra a fost creat de Windows, dar inc nu este afiat pe ecran.
Pentru aceasta mai sunt necesare inc 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.
Pentru a redesena fereastra la dimensionara ei dupa chemarea funciei de afiare facem apelul funciei de
noire (redesenare) UpdateWindow n aa mod de fiecare data cnd fereastra noastr va fi modificata funcia
dat va redesena fereastra din nou cu parametrii schimbai.

Listingul programului
#include <windows.h>
const char g_szClassName[] = "myWindowClass";
// Pasul 4: Procedura ferestrei
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
HDC
hdc ;

PAINTSTRUCT ps ;
RECT
rect ;
static WPARAM fwSizeType;
static WORD
nWidth;
static WORD
nHeight;
switch(msg)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
//SetBkColor(hdc, RGB(40,200,80));
//SetTextColor(hdc, RGB(255,255,255));
DrawText (hdc, "Lucrarea de laborator al studentului Cobilas
Adrian", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
break;
case WM_SIZE:
// Metoda de schimbare a dimensiunei ferestrei
fwSizeType = wParam;
// Latimea partii inferioare a ferestrei
nWidth = LOWORD(lParam);
// Inaltimea partii inferioare a ferestrei
nHeight = HIWORD(lParam);
InvalidateRect(hwnd, NULL, TRUE);
// Reinoim fereastra
UpdateWindow(hwnd);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;

//Pasul 1: Inregistrarea clasei ferestrei


wc.cbSize
= sizeof(WNDCLASSEX);
wc.style
= 0;
wc.lpfnWndProc
= WndProc;
wc.cbClsExtra
= 0;
wc.cbWndExtra
= 0;
wc.hInstance
= hInstance;
wc.hIcon
= LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor
= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm
= LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Inregistrarea ferestrei a esuat!", "Eroare!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Pasul 2: Crearea ferestrei
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Laboratorul nr 1 Cobilas Adrian",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 540, 240,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Inregistrarea ferestrei a esuat!", "Eroare!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

// Pasul 3: Bucla de mesaje


while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;

Rezultatul rulrii

Concluzii
In urma efectuarii acestei lucrari am studiat bazele i principiile de creare a aplicaiilor Windows, crearea
ferestrelor, prelucrarea mesajelor.Am aflat cum se afiseaza un text in centrul ferestrei prelucrind pesajul
WM_SIZE de fiecare data cind este redimensionata fereastra.
Bibliografie
http://fpce9.fizica.unibuc.ro/cpp/cpp_win32_prima_fereastra.htm
http://www.vsokovikov.narod.ru/New_MSDN_API/Fonts_text/fn_drawtext.htm