Sunteți pe pagina 1din 12

MINISTERUL EDUCAIEI I TINERETULUI AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICA A MOLDOVEI


Facultatea Calculatoare, Informatic i Microelectronic

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

TEMA: Interfaa GDI

A efectuat:

st.Gr. TI-122 Cobla Adrian

A verificat:

lector asistent Lisnic Inga

Chiinu 2014

Scopul lucrrii
De a studia primitivele oferite de interfaa GDI

Sarcina propus
Scriei un program care afieaz n zona client un desen animat, utiliznd toate primitivele GDI.

Noiuni teoretice
Interfaa pentru dispozitive grafice (GDI - Graphics Device Interface) este o component a sistemului de
operare Windows i are ca sarcin afiarea elementelor grafice (inclusiv a textului) pe ecran i la imprimant.
De asemenea, trebuie s tii c interfa Windows GDI i are limitele ei. Cel puin n acest moment, interfa
GDI nu poate s fac tot ce v-ai putea dori de la o interfa grafic. Dei putei s mutai pe ecran obiecte
grafice, GDI este, n general, un sistem de afiare static, ce permite numai animaii limitate. Aa cum este
implementat n Windows 95, interfa GDI nu asigur un suport direct pentru afiarea tridimensional sau
pentru rotirea obiectelor. De exemplu, atunci cnd desenai o elips, axele acesteia trebuie s fie paralele cu
axele sistemului de coordonate. Dei unele limbaje grafice folosesc numere n virgul mobil pentru
coordonatele virtuale. Windows 95 - din motive legate de performan - folosete numai numere ntregi pe 16
bii aceasta este una dintre deficienele sistemului de operare Windows 95. Windows NT permite folosirea
coordonatelor pe 32 de bii.
Din punctul de vedere al programatorului, interfaa GDI este format din cteva sute de apeluri de funcii i
unele tipuri de date, macroinstruciuni i structuri asociate acestor funcii, nainte de a studia n detaliu cteva
dintre aceste funcii, haidei s vedem care este structura general a interfeei GDI.
Tipuri de apeluri de funcii
n general, apelurile de funcii GDI pot fi clasificate n mai multe categorii. Chiar dac nu sunt foarte stricte i
exist unele suprapuneri, aceste categorii pot fi enunate astfel:

Funcii care obin (sau creeaz) i elibereaz (sau distrug) un context de dispozitiv.

Funcii care obin informaii despre contextul de dispozitiv.

Funcii care deseneaz ceva.

Funcii care stabilesc sau obin atribute ale contextului de dispozitiv.

Funcii care lucreaz cu obiecte GDI.

Elementele grafice pe care le afiai pe ecran sau le tiprii la imprimant pot fi mprite n mai multe
categorii, numite primitive". Iat care sunt aceste categorii:

Linii i curbe. Liniile reprezint baza oricrui sistem de desenare vectorial. GDI permite folosirea
liniilor drepte, a dreptunghiurilor, a elipselor (inclusiv subsetul de elipse cunoscute sub numele de
cercuri), a arcelor - care sunt curbe reprezentnd poriuni din circumferina unei elipse sau a curbelor
Bezier. Liniile sunt desenate folosind penia curent selectat n contextul de dispozitiv.

Suprafee pline. Dac o serie de linii sau de curbe nchid o suprafa, aceasta poate fi umplut"
folosind pensula GDI curent. Aceast pensul poate fi o culoare compact, un model (hauri
orizontale, verticale sau pe diagonal) sau o imagine bitmap repetat pe vertical sau pe orizontal.

Imagini bitmap. Imaginile bitmap sunt matrice dreptunghiulare de bii, care corespund pixelilor unui
dispozitiv de afiare. n general, acestea sunt folosite pentru afiarea imaginilor complexe (deseori
preluate din lumea real) pe ecran sau pentru tiprirea acestora la imprimant. De asemenea,
imaginile bitmap sunt folosite pentru afiarea unor mici imagini (cum ar fi pictograme, indicatoare de
mouse i butoane de pe barele cu instrumente de lucru ale aplicaiilor) care trebuie afiate foarte
rapid.

Text. Textul este mai puin matematic" dect alte aspecte ale graficii pe calculator. Structurile create
pentru definirea fonturilor i pentru obinerea informaiilor despre fonturi sunt printre cele mai mari
din Windows. ncepnd cu versiunea Windows 3.1, interfaa GDI accept fonturile TrueType, bazate
pe contururi umplute, care pot fi manipulate de alte funcii GDI. Windows 95 accept n continuare i
fonturile mai vechi, de tip bitmap (cum este fontul sistem prestabilit) pentru compatibilitate i pentru
economisirea spaiului de memorie.

Alte aspecte ale interfeei GDI nu sunt la fel de uor de clasificat. Printre acestea se numr:

Moduri de mapare i transformri. Modurile de mapare GDI v permit s desenai folosind ca unitate
de msur inci (sau fraciuni de inci), milimetri sau orice alt unitate de msur. De asemenea.
Windows 95 asigur suportul pentru o transformare real" exprimat printr-o matrice 3x3. Aceast
transformare permite deformarea i rotirea obiectelor grafice. Din pcate, aceast transformare nu
este acceptat sub Windows 95.

Metafiiere (metafiles). Un metafiier este o colecie de comenzi GDI stocate ntr-o form binar.
Metafiierele sunt folosite pentru transferarea reprezentrilor unor elemente grafice vectoriale prin
intermediul memoriei temporare (clipboard).

Regiuni (regions). O regiune este o suprafa complex de orice form, definit ca o combinaie
boolean de regiuni mai simple. n general, regiunile sunt stocate intern de GDI ca o serie de linii de
scanare, diferite de combinaia de linii folosit iniial pentru definirea regiunii. Putei s folosii
regiunile pentru contururi, pentru umplere sau pentru decupare.

Ci (paths). O cale este o colecie de linii drepte i curbe stocate intern de GDI. Cile pot fi folosite
pentru desenare, pentru umplere sau pentru decupare. De asemenea, cile pot fi transformate n
regiuni.

Decupare (clipping). Desenarea poate fi limitat la o anumit seciune a zonei client, numit zon de
decupare, care poate fi dreptunghiular sau poate avea o alt form, definit printr-o serie de linii.
Zona de decupare este definit, n general, de o cale sau de o regiune.

Palete (palettes). Folosirea paletelor proprii este limitat, n general, numai la monitoarele care pot
reda 256 de culori. Windows rezerv 20 dintre aceste culori pentru sistemul de operare. Celelalte 236
de culori pot fi modificate pentru afiarea corespunztoare a imaginilor din lumea real, stocate ca
imagini bitmap.

Tiprire (printing). Dei discuiile din acest capitol sunt limitate doar la afiarea pe ecran, tot ceea ce
nvai n acest capitol poate fi aplicat i operaiilor de tiprire. (Vezi Capitolul 15 pentru alte
informaii despre tiprire.)

Contextul de dispozitiv
Atunci cnd vrei s desenai la un dispozitiv de ieire grafic (cum ar fi ecranul sau imprimanta) trebuie s
obinei mai nti o variabil handle a contextului de dispozitiv (DC - device context). Variabila handle este
apoi inclus ca parametru n apelul unei funcii GDI, identificnd dispozitivul Ia care vrei s desenai.
Contextul de dispozitiv conine mai multe atribute curente, care specific modul de lucru al funciilor GDI
pentru dispozitivul respectiv. Aceste atribute permit ca la apelarea funciilor GDI s fie specificate numai
coordonatele de nceput sau dimensiunea, nu i toate celelalte informaii de care sistemul de operare are
nevoie pentru desenarea obiectelor pe dispozitivul folosit. Atunci cnd dorii s modificai unul dintre aceste
atribute ale contextului de dispozitiv, apelai o funcie specializat.

Obinerea variabilei handle a contextului de dispozitiv


Sistemul de operare Windows v pune la dispoziie mai multe metode pentru obinerea variabilei handle a
contextului de dispozitiv. Dac obinei o variabil handle a contextului de dispozitiv n timpul prelucrrii
unui mesaj, ar trebui s tergei aceast variabil nainte de ieirea din procedura de fereastr. Dup ce este
tears, variabila handle nu mai poate fi folosit (nu mai este valid).
Cea mai cunoscut metod de obinere i de tergere a variabilei handle a contextului de dispozitiv implic
folosirea funciilor BeginPaint i EndPaint n timpul prelucrrii mesajului WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
[alte linii de program]
EndPaint (hwnd, &ps);
Variabila ps este o structur de tip PAINTSTRUCT. Cmpul hdc al acestei structuri conine variabila handle a
contextului de dispozitiv. Folosind variabila handle a contextului de dispozitiv, obinut prin apelarea funciei
BeginPaint, nu putei s desenai dect n regiunea invalid a ferestrei. Funcia BeginPaint valideaz regiunea
invalid.
Programele Windows pot s obin variabila handle a contextului de dispozitiv i n timpul prelucrrii altor
mesaje dect WM_PAINT:
hdc = GetDC (hwnd);
(alte linii de program]
ReleaseDC (hwnd, hdc);
Acest context de dispozitiv se aplic zonei client a ferestrei care are variabila handle hwnd. Principala
diferen ntre apelul de mai sus i metoda folosirii funciilor BeginPaint i EndPaint este c variabila handle
returnat de funcia GetDC v permite s desenai n toat zona client a ferestrei. n plus, funciile GetDC i
ReleaseDC nu valideaz eventualele regiuni invalide ale zonei client.

Un program Windows poate s obin i o variabil handle a unui context de dispozitiv care se aplic ntregii
ferestre, nu numai zonei client a ferestrei:
hdc = GetWindowDC (hwnd);
[alte linii de program]
ReleaseDC (hwnd, hdc);
[alte linii de program]
DeleteDC (hdc);

Obinerea informaiilor despre culori


Funcia GetDeviceCaps v permite s determinai modul de organizare a memoriei n adaptoarele video i
numrul de culori care pot fi reprezentate. Apelul de mai jos returneaz numrul de planuri de culoare:
iPlanes = GetDeviceCaps (hdc, PLANES);
Apelul urmtor returneaz numrul de bii de culoare folosii pentru fiecare pixel:
iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL);
Majoritatea adaptoarelor video care pot afia culori folosesc fie mai multe planuri de culoare, fie mai muli
bii de culoare pentru fiecare pixel, dar nu pe amndou; cu alte cuvinte, unul dintre cele dou apeluri de mai
sus va returna valoarea 1. Numrul de culori care pot fi redate de o plac video se poate calcula cu formula
urmtoare:
iColors = 1<<(iPlanes * iBitsPixel);
Aceast valoare poate s nu fie identic cu numrul de culori obinut prin apelarea funciei GetDeviceCaps cu
parametrul NUMCOLORS:
iColors = GetDeviceCaps (hdc, NUMCOLORS);
Windows folosete pentru reprezentarea culorilor o valoare ntreag fr semn, pe 32 de bii. Tipul de date
folosit pentru culori se numete COLORREF. Ultimii trei octei ai numrului (cei mai puin semnificativi)
specific valorile pentru culorile rou, verde i albastru, de la O la 255, aa cum se poate vedea n Figura 4-3.
Rezult o palet potenial de 224 culori (aproximativ 16 milioane de culori).
Valoarea pe 32 de bii de mai sus e numit deseori culoare RGB". n fisierele antet din Windows sunt
definite mai multe macroinstruciuni pentru lucrul cu valorile RGB. Macroinstructiunea RGB accept trei
argumente, care reprezint valorile pentru culorile rou, verde i albastru i le combin ntr-o valoarea
ntreag pe 32 de bii, fr semn.
Astfel, valoarea
RGB (255, 0, 255)

este de fapt 0x00FF00FF, valoarea RGB pentru magenta. Dac toate cele trei argumente au valoarea 0, se
obine negrul, iar dac au valoarea 255, se obine albul. Macroinstruciunile GetRValue, GetGValue i
GetBValue extrag valorile pentru culorile primare, sub forma unor octei fr semn, din valoarea RGB a
culorii. Aceste macroinstructiuni sunt utile atunci cnd apelai funcii Windows care returneaz culori RGB.
Salvarea contextului de dispozitiv
n mod normal, Windows creeaz un nou context de dispozitiv cu valori prestabilite atunci cnd apelai una
dintre funciile GetDC sau BeginPaint. Toate modificrile fcute n atributele contextului de dispozitiv se
pierd atunci cnd contextul de dispozitiv este ters din memorie prin apelarea funciei ReleaseDC sau a
funciei EndPaint. Dac programul trebuie s foloseasc un atribut cu o valoarea diferit de cea prestabilit
va trebui s iniializai contextul de dispozitiv de fiecare dat cnd obinei o variabil handle:
caseWM_Paint:
hdc = BeginPaint (hwnd, &ps);
[iniializeaz atributele contextului de dispozitiv]
[deseneaz zona client a ferestrei]
EndPaint (hwnd, &ps);
return 0;
Dei aceast abordare este n general satisfctoare, s-ar putea s preferai s salvai modificrile fcute
asupra contextului de dispozitiv ia distrugerea acestuia, astfel nct valorile salvate s redevin active la
apelarea funciilor GetDC sau BeginPaint.

Raspunsuri la intrebari:
1) Descriei principalele primitive ale interfeei grafice.
Elementele grafice pe care le afiai pe ecran sau le tiprii la imprimant pot fi mprite n mai multe
categorii, numite primitive". Iat care sunt aceste categorii:

Linii i curbe. Liniile reprezint baza oricrui sistem de desenare vectorial. GDI permite folosirea liniilor
drepte, a dreptunghiurilor, a elipselor (inclusiv subsetul de elipse cunoscute sub numele de cercuri), a
arcelor - care sunt curbe reprezentnd poriuni din circumferina unei elipse sau a curbelor Bezier. Despre
toate aceste clemente vom mai discuta n capitolul de fa. Orice curb mai complex poate n desenat ea
o linie poligonal, adic o serie de linii foarte scurte care definesc o curb. Liniile sunt desenate folosind
penia curent selectat n contextul de dispozitiv.

Suprafee pline. Dac o serie de linii sau de curbe nchid o suprafa, aceasta poate fi umplut" folosind
pensula GDI curent. Aceast pensul poate fi o culoare compact, un model (hauri orizontale, verticale
sau pe diagonal) sau o imagine bitmap repetat pe vertical sau pe orizontal.

Imagini bitmap. Imaginile bitmap sunt matrice dreptunghiulare de bii, care corespund pixelilor unui
dispozitiv de afiare. Imaginile bitmap sunt instrumente de baz pentru sistemele grafice de tip rastru. n
general, acestea sunt folosite pentru afiarea imaginilor complexe (deseori preluate din lumea real) pe

ecran sau pentru tiprirea acestora la imprimant. De asemenea, imaginile bitmap sunt folosite pentru
afiarea unor mici imagini (cum ar fi pictograme, indicatoare de mouse i butoane de pe barele cu
instrumente de lucru ale aplicaiilor) care trebuie afiate foarte rapid. Interfaa GDI accept dou tipuri de
imagini bitmap: un tip mai vechi (dar util) de imagini bitmap dependente de dispozitiv i un tip mai nou
(precum cele din Windows 3.0) de imagini bitmap independente de dispozitiv (DIB - Device Independent
Bitmap) care pot fi stocate n fiiere.

Text. Textul este mai puin matematic" dect alte aspecte ale graficii pe calculator. Textul, aa cum l
tim, este legat de sute de ani de tipografia tradiional, apreciat adesea ca adevrat art. Din acest
motiv, textul este de multe ori nu doar cea mai complex parte a sistemului grafic, ci i cea mai
important. Structurile create pentru definirea fonturilor i pentru obinerea informaiilor despre fonturi
sunt printre cele mai mari din Windows. ncepnd cu versiunea Windows 3.1, interfaa GDI accept
fonturile TrueType, bazate pe contururi umplute, care pot fi manipulate de alte funcii GDI. Windows 95
accept n continuare i fonturile mai vechi, de tip bitmap (cum este fontul sistem prestabilit) pentru
compatibilitate i pentru economisirea spaiului de memorie.

2) Enumerai metodele de obinere a variabilei handle a dispozitivului de context.

Sistemul de operare Windows pune la dispoziie mai multe metode pentru obinerea variabilei handle a
contextului de dispozitiv.
Cea mai cunoscut metod de obinere i de tergere a variabilei handle a contextului de dispozitiv implic
folosirea funciilor BeginPaint i EndPaint n timpul prelucrrii mesajului WM_PAINT:
hdc - BeginPaint (hwnd, &ps);
[alte Unii de program] EndPaint (hwnd, &ps);
Variabila ps este o structur de tip PAINTSTRUCT. Cmpul hdc al acestei structuri conine variabila handle a
contextului de dispozitiv. Structura PAINTSTRUCT conine i o structur de tip RECT numit rcPaint, care
definete dreptunghiul ce cuprinde regiunea invalid a zonei client a ferestrei. Folosind variabila handle a
contextului de dispozitiv, obinut prin apelarea funciei BeginPaint, nu putei s desenai dect n regiunea
invalid a ferestrei. Funcia BeginPaint valideaz regiunea invalid.
Programele Windows pot s obin variabila handle a contextului de dispozitiv i n timpul prelucrrii altor
mesaje dect WM_PAINT:
hdc = GetDC (hwnd);
(alte linii de program] ReleaseDC (hwnd, hdc);
Acest context de dispozitiv se aplic zonei client a ferestrei care are variabila handle hwnd. Principala
diferen ntre apelul de mai sus i metoda folosirii funciilor BeginPaint i EndPaint este c variabila handle
returnat de funcia GetDC v permite s desenai n toat zona client a ferestrei. n plus, funciile GetDC i
ReleaseDC nu valideaz eventualele regiuni invalide ale zonei client.
Un program Windows poate s obin i o variabil handle a unui context de dispozitiv care se aplic ntregii
ferestre, nu numai zonei client a ferestrei:
hdc = GetWindowDC (hwnd);
[alte linii de program] ReleaseDC (hwnd, hdc);
Contextul de dispozitiv include, n afar de zona client, bara de titlu a ferestrei, barele de derulare i chenarul.
Funcia GetWindowDC este rareori folosit de aplicaii. Dac vrei s experimentai folosirea acestei funcii,

trebuie s interceptai mesajele WM_NCPAINT (nonclient paint"), mpiedicnd sistemul de operare s


redeseneze poriunile din fereastr care nu fac parte din zona client.
Funciile BeginPaint, GetDC i GetWindowDC obin variabila handle a contextului de dispozitiv asociat unei
anumite ferestre de pe ecran. O funcie mai general pentru obinerea variabilei handle a unui context de
dispozitiv este CreateDC:
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
[alte linii de program] DeleteDC (hdc);
De exemplu, putei s obinei variabila handle a contextului de dispozitiv pentru tot spaiul de afiare, cu
urmtorul apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
Scrierea n afara ferestrei proprii nu este n general recomandat, dar poate fi convenabil pentru unele
aplicaii speciale. (Dei aceast metod nu e documentat, se poate obine o variabila handle a contextului de
dispozitiv pentru ntregul ecran i prin apelarea funciei GetDC, cu parametrul NULL.) n Capitolul 15 vom
folosi funcia CreateDC pentru a obine o variabil handle a contextului de dispozitiv pentru o imprimant.
Uneori avei nevoie de unele informaii despre un context de dispozitiv fr s desenai nimic. n aceast
situaie putei s obinei o variabila handle a contextului de informaii (information context") folosind
funcia CreateIC. Parametrii sunt aceiai ca i pentru funcia CreateDC:
hdclnfo = CreatelC ("DISPLAY", NULL, NULL, NULL);
[alte linii de program] DeleteDC (hdclnfo);
Nu putei s executai operaii de scriere la un dispozitiv folosind aceast variabil handle. Atunci cnd lucrai
cu imagini bitmap, poate fi uneori util obinerea unui context de dispozitiv n memorie":
hdcMem = CreateCompatibleDC (hdc);
[alte linii de program] DeleteDC (hdcHem)
Acesta este un concept destul de abstract. n esen, putei s selectai o imagine bitmap ntr-un context de
dispozitiv n memorie i apoi s desenai peste folosind funciile GDI. Vom discuta mai trziu despre aceast
tehnic i o vom folosi n programul GRAFMENU din Capitolul 10.
Aa cum am menionat mai devreme, un metafiier este o colecie de apeluri GDI codificate ntr-o form
binar. Putei s creai un metafiier prin obinerea unui context de dispozitiv pentru metafiiere:
hdcMeta = CreateMetaFile (pszFilename);
[alte linii de program] hmf = CloseMetaFile (hdcMeta);
Ct timp acest context este valid, nici un apel GDI pe care l facei folosind parametrul hdcMeta nu afieaz
nimic pe ecran, ci devine parte a metafiierului. Apelai apoi funcia CloseMetaFile i contextul de dispozitiv
este invalidat. Funcia returneaz o variabil handle a metafiierului (hmf).
3) Ce sisteme de coordonate ale dispozitivului de context cunoatei?
Un context de dispozitiv se refer, de obicei, la un dispozitiv fizic de ieire, cum ar fi un monitor video
sau o imprimant. Dac avei nevoie de anumite informaii despre acest dispozitiv, cum ar fi dimensiunile
ecranului (dimensiunile n pixeli i cele fizice) sau posibilitile de folosire a culorilor, putei s le obinei
prin apelarea funciei GetDeviceCaps (get device capabilities"):

iValue = GetDeviceCaps (hdc, iIndex) ;


Parametrul iIndex este unul dintre cei 28 de identificatori definii n fiierele antet din Windows. De
exemplu, dac iIndex are valoarea HORZRES funcia GetDeviceCaps returneaz limea dispozitivului n
pixeli; VERTRES returneaz nlimea dispozitivului n pixeli. Dac hdc este o variabil handle a contextului
de dispozitiv pentru un monitor video, informaiile obinute sunt aceleai cu cele returnate de funcia
GetSystemMetrics. Dac hdc este o variabil handle a contextului de dispozitiv pentru o imprimant, funcia
GetDeviceCaps returneaz nlimea i limea zonei pe care imprimant o poate tipri.
Putei s folosii funcia GetDeviceCaps i ca s obinei informaii despre posibilitile unui dispozitiv de
prelucrare a anumitor tipuri de elemente grafice. Aceast posibilitate nu este important pentru ecran, dar poate fi
folosit n cazul imprimantelor. De exemplu, majoritatea plotterelor nu pot tipri imagini bitmap - iar funcia
GetDeviceCaps v poate comunica acest lucru

Listingul programului
#include <Windows.h>
#include <Math.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hwndMain;
MSG msg;
WNDCLASS wndCls;
UNREFERENCED_PARAMETER(lpCmdLine);
wndCls.style = 0;
wndCls.lpfnWndProc = (WNDPROC) WndProc;
wndCls.cbClsExtra = 0;
wndCls.cbWndExtra = 0;
wndCls.hInstance = hInstance;
wndCls.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
wndCls.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
wndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndCls.lpszMenuName = NULL;
wndCls.lpszClassName = "WndClass";
if (!RegisterClass(&wndCls))
return FALSE;
hwndMain = CreateWindow(
"WndClass",
"Laboratorul nr 2",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,760,350,
(HWND) NULL,(HMENU) NULL,hInstance,(LPVOID) NULL);

if (!hwndMain)
return FALSE;
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
HDC
hdc,hCompatibleDC ;
PAINTSTRUCT ps ;
RECT
rect ;
HPEN pen,pen2,old_pen;
HBRUSH brush,old_br;
HANDLE hOldBitmap;
HANDLE hBitmap;
BITMAP Bitmap;
char sir[150];
short lungime=sprintf(sir, "Lucrarea de laborator nr.2 a studentului TI-122 Cobilas
Adrian");
switch(uMsg){
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
//-----------------------------------------------------------------------------//Desenam linii dreapte
//
//crearea a doua penite noi
pen = CreatePen(PS_SOLID,2,RGB(255,100,100));
pen2 = CreatePen(PS_SOLID,2,RGB(20,60,50));
//pastrarea penitei vechi
old_pen=(HPEN)SelectObject(hdc,pen);
MoveToEx(hdc,50,50,NULL);
LineTo(hdc,150,150);
MoveToEx(hdc,150,150,NULL);
LineTo(hdc,50,150);
//stergerea penitei pen
DeleteObject(pen);
//-----------------------------------------------------------------------------//Desenam o elipsa impluta
//
//crearea unei noi pensule

//brush=CreateSolidBrush(RGB(0,33,33));
brush=CreateHatchBrush(HS_DIAGCROSS, RGB(33,200,230));
//pastrarea pensulei vechi
old_br=(HBRUSH)SelectObject(hdc,brush);
SelectObject(hdc,pen2);
//Rectangle(hdc,200, 50, 375, 150); //Dreptunghi
Ellipse(hdc,200, 50, 475, 150); //Elipsa
//stergerea obiectelor create
DeleteObject(pen2);
DeleteObject(brush);
//restaurarea obiectelor anterioare
SelectObject(hdc,old_pen);
SelectObject(hdc,old_br);
//-----------------------------------------------------------------------------//Incarcam o imagine BITMAP
//
hBitmap
=(HBITMAP)LoadImage(NULL,"bitmap.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//Obtinem marimea imaginii bitmap
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
//Cream o noua variabila handle a contextului de dispozitiv
hCompatibleDC = CreateCompatibleDC(hdc);
//Pastram imaginea veche bitmap
hOldBitmap = SelectObject(hCompatibleDC,hBitmap);
//Copiem imaginea bitmap si o deplasam
StretchBlt(hdc,520,30,170,156,
hCompatibleDC,0,0,Bitmap.bmWidth,
Bitmap.bmHeight,SRCCOPY);
//Restauram obiectul anterior
SelectObject(hCompatibleDC,hOldBitmap);
//Stergem imaginea bitmap incarcata
DeleteObject(hBitmap);
//Stergem variabila handle a contextului de dispozitiv
DeleteDC(hCompatibleDC);
//-----------------------------------------------------------------------------//Afisam text
//
SetTextColor(hdc, RGB(60,100,220));
//SetBkColor(hdc, RGB(60,100,100));
TextOut(hdc,150,200,sir,lungime);
//-----------------------------------------------------------------------------EndPaint(hwnd,&ps);
return 0;
case WM_CLOSE:
PostMessage(hwnd, WM_QUIT, 0L, 0L);
return 0;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Rezultatul rulrii

Concluzii
In urma efectuarii acestei lucrari de laborator am studiat bazele i principiile de functionare a functiilor
GDI.Am invatat sa folosim resursele acestei biblioteci pentru a desena diferite figuri utilizind primitivele
GDI.
Bibliografie
http://www.miv.ro/isip2009/ISIP2009_Lab1.pdf
http://www.infoap.utcluj.ro/wincpp/cap02/Cap2.pdf