Anda di halaman 1dari 6

UNIVERSITATEA TEHNICĂ A MOLDOVEI

Facultatea: Calculatoare informatică Microelectronică

Referat
Disciplina:Progrmarea în Windows

Lucrare de laborator nr. 1

TEMA: Aplicaţii Windows

A efectuat st. gr. TI-132 Postica Nicolae


A verificat Lisnic Inga

Chisinau 2015
1 Scopul si sarcina lucrarii
De studiat bazele şi principiile de creare aaplicaţiilor Windows.
De ceat o aplicaţie Windows, în centrul zonei client al căreia este afişat un mesaj. La
redimensionarea
ferestrei, mesajul trebuie sa fie afişat în centrul zonei client.

2 Indicaţii teoretice
2.1 Pentru crearea unei aplicaţii windows în limbajul C este nevoie de biblioteca windows.h,
în care se conţint funcţii predifinite ce fac posibila legatura cu bibliotecile sistemului de
opereare (.dll) pentru crearea aplicaţiei. Mai jos sunt prezentate careva din aceste funcţii:
· LoadIcon - incarcă o pictogramă care urmează să fie folosită de un program.
· LoadCursor - incarcă un indicator pentru mouse, care urmează să fie folosit de un program.
· GetStockObject - obţine un obiect grafic (in acest caz o pensulă folosită pentru desenarea
fondului
ferestrei).
· RegisterClassEx - inregistrează 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 - incheie o operaţie de desenare.
· PostQuitMessage - inserează un mesaj de incheiere in coada de aşteptare.
· DefWindowProc - execută operaţiile prestabilite de prelucrare a mesajelor.

2.2 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ă . Cele mai
importante campuri ale clasei de fereastră sunt al treilea şi penultimul. Penultimul cîmp
conţine numele clasei de fereastră.

2.3 Atunci cand creem o fereastră apelînd funcţia Create Window, putem să specificam mai
multe detalii despre fereastra respectivă. In loc să folosească o structură de date, aşa cum
face funcţia RegisterClassEx, funcţia CreateWindow cere ca toate informaţiile să fie
transmise ca parametri. Mai jos este reprezentat un apel al funcţiei CreateWindow:
hwnd =CreateWindow (szAppName, // numele clasei de fereastra
"PRO", // titlul ferestrei
WS_OVERLAPPEDWINDOW, // stilul ferestrei
CW_USEDEFAULT, // poziţia iniţiala pe axa x
CW_USEDEFAULT, // poziţia iniţiala pe axa y
CW_USE DEFAULT, // dimensiunea iniţiala pe axa x
CW_USEDEFAULT, // dimensiunea iniţiala pe axa y
NULL, // variabila handle a ferestrei părinte
NULL, // variabila handle a meniului
hlnstance, // variabila handle a instanţei programului
NULL) ; // parametri de creare

2.4 După executarea funcţiei CreateWindow, fereastra a fost creată de Windows, dar incă nu
este afişată pe ecran. Pentru aceasta mai sunt necesare incă două apeluri de funcţii.
Primul este:
ShowWindow (hwnd, iCmdShow) ;
Primul parametru este o variabilă handle a ferestrei create de funcţia CreateWindow. Al
doilea parametru este variabila iCmdShow, transmisă funcţiei WinMain. Dacă iCmdShow
este SW_SHOWNORMAL (egal cu 1), fereastra este afişată normal. Dacă iCmdShow este
SW_SHOWMINNOACTIVE (egal cu 7), atunci fereastra nu este afişată, dar numele şi
pictograma acesteia apar pe bara de taskuri.

3 Realizarea sarcinii
3.1 După declararea variabilelor necesare şi includerea bliotecilor pentru crearea
aplicatiei windows şi anume a unei ferestre declaram clasa acesteia întroducîndui
parametri necesari, dupa cum e arătat mai jos (exemplu este din Anexa A):

ATOM MyRegisterClass(HINSTANCE hInstance)


{ WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_L1PW);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_L1PW;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex); }

În clasa data sunt întroduşi paramentrii de bază necesari pentru crearea ferestrei aşa
cum ar fi marimea ei, numele ferestrei, tipul de cursor şi altele

3.2 Al doilea pas după declararea clasei de fereastră este crearea ei cu ajutorul funcţiei
CreateWindow şi respectiv introducerea din nou a parametrilor de bază pentru crearea
acesteia, mai jos este arătat apelul funcţiei care fa fel este folosit în programul din anexă:

hWnd = CreateWindow(szWindowClass,"IN cautarea centrului",


WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

Parametri de cheare a acestei funcţii sunt descrişi în punctul 2.3.

3.3 Odată cu declararea tuturor parametrilor necesari pentru crearea şi afişarea ferestrei
putem apela funcţia de afişare a ferestrei ShowWindow cu parametrii deja declaraţi
mai devreme.

3.4 Pentru a redesena fereastra la dimensionara ei dupa chemarea funcţiei de afişare


facem apelul funcţiei de înoire (redesenare) UpdateWindow în aşa mod defiecare data
cînd fereastra noastră va fi modificata funcţia dată va redesenaua dinou cu parametrii
skimbaţi.
În cazul programului nostru rezultatul este prezentat în Figura 1.
Screenul programului

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[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = (LPCWSTR)szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_ASTERISK);
RegisterClassEx(&wndclass);
hwnd = CreateWindow((LPCWSTR)szAppName,
L"Laboratorul 1",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
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;
switch (iMsg) {
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, L"Lucrarea de laborator NR1", -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);
}
Concluzie: În această lucrare de laborator am efectuat prima cunoștintă practică cu
limbajul WIN API și am ceat cel mai simplu soft.

Anda mungkin juga menyukai