Sunteți pe pagina 1din 8

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: A verificat:

st.Gr. TI-122 Cobla Adrian lector asistent Lisnic Inga

Chiinu 2013

Scopul lucrrii
De studiat bazele i principiile de creare a aplicaiilor Windows

Sarcina propus
Creai o aplicaie Windows , n centrul zonei client al creia este afiat un mesaj Lucrarea de laborator a studentului. La redimensionarea ferestrei, mesajul trebuie sa fie afiat 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 car e 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. Raspunsuri la intrebari: 1) 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) 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) Cimpurile clasei de fereastra: WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); // . wcex.style style") wcex.lpfnWndProc wcex.cbClsExtra wcex.cbWndExtra wcex.hInstance wcex.hIcon = (WNDPROC)WndProc; // adresa procedurii de fereastr = 0;// rezerv un spaiu suplimentar n structura clasei = 0;// rezerv un spaiu suplimentar n structura ferestrei = hInstance; // variabila handle a instanei = LoadIcon(hInstance, (LPCTSTR)IDI_L1PW);// defineste o pictogram = CS_HREDRAW | CS_VREDRAW; // stilul de clas" (class

wcex.hCursor mouse,

= LoadCursor(NULL, IDC_ARROW);// ncarc un cursor predefinit pentru

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);// precizeaz culoarea fondului zonei client a ferestrelor wcex.lpszMenuName wcex.lpszClassName wcex.hIconSm pictogram = (LPCSTR)IDC_L1PW; //specific meniul ferestrei. = szWindowClass;// numele Clasei = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);// defineste o

4) 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) 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) 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); Parametrii functiei: hwnd =CreateWindow (szAppName, // numele clasei de fereastra "The Hello Program", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USE DEFAULT, CW_USEDEFAULT, NULL, NULL, hlnstance, NULL) ; // titlul ferestrei // stilul ferestrei // poziia iniiala pe axa x // poziia iniiala pe axa y // dimensiunea iniiala pe axa x // dimensiunea iniiala pe axa y // variabila handle a ferestrei printe // variabila handle a meniului // variabila handle a instanei programului // parametri de creare

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