Prog. Windows Lab.2 Md

download Prog. Windows Lab.2 Md

of 19

Transcript of Prog. Windows Lab.2 Md

  • 7/21/2019 Prog. Windows Lab.2 Md

    1/19

    Ministerul Educaiei al Republicii MoldovaUniversitatea Tehnic a Moldovei

    Facultatea Calculatoare, Informatic i Microelectronic

    RAPORTLucrarea de laborator nr. 2

    la disciplina:ro!ramarea in "indo#s

    Tema:Interfata $%I

    A efectuat:Mer alov %mitrii

    A verificat:Co&ocaru 'vetlana

    Chiinu ()*+

  • 7/21/2019 Prog. Windows Lab.2 Md

    2/19

    LUCRARE DE LABORATOR NR. 2

    1.Tema :Interfaa GDI

    2.Scopul lucrarii 'tudierea primitivelor oferite de interfaa GDI.3.Sarcina lucrrii: 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 asistemului 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 puteis mutai pe ecran obiecte grafice, GDI este, n general, un sistem de afiare static, ce permitenumai animaii limitate. Aa cum este implementat n Windows 95, interfa GDI nu asigur unsuport direct pentru afiarea tridimensional sau pentru rotirea obiectelor. De exemplu, atuncicnd 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 biiaceasta 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 astudia 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:

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

    o Funcii care obin informaii despre contextul de dispozitiv.

    o Funcii care deseneaz ceva.

    o Funcii care stabilesc sau obin atribute ale contextului de dispozitiv.

    o Funcii care lucreaz cu obiecte GDI.

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

  • 7/21/2019 Prog. Windows Lab.2 Md

    3/19

    o Linii i curbe.Liniile reprezint baza oricrui sistem de desenare vectorial. GDI permite

    folosirea liniilor drepte, a dreptunghiurilor, a elipselor (inclusiv subsetul de elipsecunoscute sub numele de cercuri), a arcelor - care sunt curbe reprezentnd poriuni dincircumferina unei elipse sau a curbelor Bezier. Liniile sunt desenate folosind peniacurent selectat n contextul de dispozitiv.

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

    o Imagini bitmap.Imaginile bitmap sunt matrice dreptunghiulare de bii, care corespund

    pixelilor unui dispozitiv de afiare. n general, acestea sunt folosite pentru afiareaimaginilor complexe (deseori preluate din lumea real) pe ecran sau pentru tiprireaacestora la imprimant. De asemenea, imaginile bitmap sunt folosite pentru afiarea unormici imagini (cum ar fi pictograme, indicatoare de mouse i butoane de pe barele cu

    instrumente de lucru ale aplicaiilor) care trebuie afiate foarte rapid.o Text. Textul este mai puin matematic" dect alte aspecte ale graficii pe calculator.

    Structurile create pentru definirea fonturilor i pentru obinerea informaiilor despre fonturisunt 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 dealte funcii GDI. Windows 95 accept n continuare i fonturile mai vechi, de tip bitmap(cum este fontul sistem prestabilit) pentru compatibilitate i pentru economisirea spaiuluide memorie.

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

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

    o Metafiiere (metafiles).Un metafiier este o colecie de comenzi GDI stocate ntr-o

    form binar. Metafiierele sunt folosite pentru transferarea reprezentrilor unor elementegrafice vectoriale prin intermediul memoriei temporare (clipboard).

    o 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 deGDI ca o serie de linii de scanare, diferite de combinaia de linii folosit iniial pentrudefinirea regiunii. Putei s folosii regiunile pentru contururi, pentru umplere sau pentru

    decupare.

    o 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, cilepot fi transformate n regiuni.

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

  • 7/21/2019 Prog. Windows Lab.2 Md

    4/19

    o Palete(palettes).Folosirea paletelor proprii este limitat, n general, numai la

    monitoarele care pot reda 256 de culori. Windows rezerv 20 dintre aceste culori pentrusistemul de operare. Celelalte 236 de culori pot fi modificate pentru afiareacorespunztoare a imaginilor din lumea real, stocate ca imagini bitmap.

    o 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 dispozitivulIa care vrei s desenai. Contextul de dispozitiv conine mai multe atribute curente, carespecific 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 itoate 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 dedispozitiv, apelai o funcie specializat.

    Obinerea variabilei handle a contextului de dispozitiv

    Sistemul de operare Windows v pune la dispoziie mai multe metode pentru obinerea variabileihandle 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 dinprocedura 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 dedispozitiv implic folosirea funciilorBeginPaintiEndPaintn timpul prelucrrii mesajuluiWM_PAINT:

    hdc = BeginPaint (hwnd, &ps);

    [alte linii de program]

    EndPaint (hwnd, &ps);

    Variabilapseste o structur de tip PAINTSTRUCT. Cmpulhdcal acestei structuri coninevariabila handle a contextului de dispozitiv. Folosind variabila handle a contextului de dispozitiv,obinut prin apelarea funcieiBeginPaint,nu putei s desenai dect n regiunea invalid a

    ferestrei. FunciaBeginPaintvalideaz regiunea invalid.

  • 7/21/2019 Prog. Windows Lab.2 Md

    5/19

    Programele Windows pot s obin variabila handle a contextului de dispozitiv i n timpulprelucrrii 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

    handlehwnd.Principala diferen ntre apelul de mai sus i metoda folosiriifunciilorBeginPaintiEndPainteste c variabila handle returnat de funciaGetDCv permites desenai n toat zona client a ferestrei. n plus, funciile GetDC iReleaseDCnu valideazeventualele regiuni invalide ale zonei client.

    Un program Windows poate s obin i o variabil handle a unui context de dispozitiv care seaplic 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

    FunciaGetDeviceCapsv permite s determinai modul de organizare a memoriei nadaptoarele video i numrul de culori care pot fi reprezentate. Apelul de mai jos returneaznumrul 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, fiemai muli bii de culoare pentru fiecare pixel, dar nu pe amndou; cu alte cuvinte, unul dintrecele 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:

  • 7/21/2019 Prog. Windows Lab.2 Md

    6/19

    iColors = 1

  • 7/21/2019 Prog. Windows Lab.2 Md

    7/19

    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 valorilesalvate s redevin active la apelarea funciilorGetDCsauBeginPaint.

    Desenarea liniilor

    Interfaa Windows GDI conine i funciileSetPixeliGetPixel.Dei vom folosi funciaSetPixelnprogramul CONNECT din Capitolul 7, n programele de grafic propriu-zis aceste funcii suntrareori folosite. n majoritatea cazurilor, cea mai simpl primitiv grafic vectorial trebuie s fie

    considerat linia.

    Windows poate s deseneze linii drepte, linii eliptice (linii curbe, pe circumferina unei elipse) icurbe Bezier. Cele apte funcii acceptate de Windows 95 pentru desenarea liniilor

    suntLineTo(linii drepte),PolylineiPolylineTo(o serie de linii drepte conectate), PolyPolyline(mai multe linii poligonale),Arc(linii eliptice),PolyBezier i PolyBezierTo.(Interfaa GDI din

    Windows NT accept nc trei funcii pentru desenarea liniilor:ArcTo,AngleArciPolyDraw.Aceste funcii nu sunt ns acceptate n Windows 95.) Aspectul liniilordesenate cu aceste funcii poate fi influenat de cinci atribute ale contextului de dispozitiv: poziiacurent a peniei (numai pentru funciileLineTo,PolylineToiPolyBezierTo),penia selectat,

    modul de afiare a fondului (numai pentru peniele care nu deseneaz cu o culoare compact),culoarea fondului (pentru modul OPAQUE de afiare a fondului) i modul de desenare.

    FunciaLineToeste una dintre puinele funcii GDI care nu are nevoie de dimensiunile completeale obiectului ce urmeaz s fie desenat. FunciaLineTodeseneaz o linie de la poziia curent"

    definit n contextul de dispozitiv pan la punctul specificat la apelarea funciei (exclusiv acestpunct). Poziia curent este folosit ca punct de plecare i de alte funcii GDI. n contextul de

    dispozitiv prestabilit, poziia curent are iniial valoarea (0,0). Dac apelai funciaLineTofr sstabilii mai nti poziia curent, funcia deseneaz o linie pornind din colul din stnga-sus al

    zonei client.

    Dac dorii s desenai o linie din punctul(xStart, yStart)pan n punctul(xEnd, yEnd)trebuie sapelai mai nti funciaMoveToExca s stabilii ca poziie curent punctul (xStart, ySfart):

    MoveToEx (hdc, xStart, yStart, &pt) ;

    unde pt este o structur de tip POINT, definit n fiierele antet.

    FunciaMoveToExnu deseneaz nimic, ci doar schimb poziia curent. Poziia curent

    anterioar este stocat n structura de tip POINT. Putei apoi s folosii funciaLineToca s

    desenai linia:

  • 7/21/2019 Prog. Windows Lab.2 Md

    8/19

    LineTo (hdc, xEnd, yEnd);

    Apelul de mai sus deseneaz o linie pn n punctul(xEnd, yEnd),exclusiv acest punct. Dupapelul funcieiLineTo,poziia curent devine(xEnd, yEnd).

    Putei s obinei poziia curent a peniei apelnd funciaGetCurrentPositionastfel:

    GetCurrentPositionEx (hdc, &pt) ;

    Atunci cnd avei o matrice de puncte pe care vrei s le conectai prin linii, putei s desenai mai

    uor liniile folosind funciaPolyline.Instruciunea de mai jos deseneaz acelai dreptunghi ca isecvena de cod din exemplul anterior:

    Polyline (hdc, pt, 5);

    Ultimul parametru reprezint numrul de puncte. Aceast valoare putea fi reprezentat i prinexpresia(sizeof(pt) / sizeof(POINT)).FunciaPolylineare acelai efect ca i ofuncieMoveToExurmat de mai multe funciiLineTo,exceptnd faptul c funciaPolylinenu

    schimb poziia curent. FunciaPolylineTo estepuin diferit. Aceasta folosete ca punct deplecare poziia curent i stabilete ca poziie curent sfritul ultimei linii desenate. Codul de

    mai jos deseneaz acelai dreptunghi folosit ca exemplu i mai sus:

    MoveToEx (hdc, pt[0].x, pt[0].y, NULL) ;

    PolylineTo (hdc, pt + 1,4) ;

    Dei putei s folosii funciilePolylineiPolylineToi pentru un numr mic de funcii, acesteasunt mai utile atunci cnd desenai o curb complex format din sute sau chiar mii de linii.

    n continuare a vrea s discutm despre funciaArc,funcie care deseneaz o curb eliptic.

    Dar funciaArcnu prea are sens dac nu discutm mai nti despre funciaEllipse,care, larndul ei, nu are sens fr o discuie despre funciaRectangle.Si dac discutm despre

    funciileRectangleiEllipse,putem la fel de bine s discutm i despre funciileRoundRect,Chordi Pie.

    Problema este c funciileRectangle, Ellipse, RoundRect, ChordiPienu sunt tocmai nitefuncii de desenare a liniilor. Desigur, ele deseneaz i linii, dar i coloreaz zona nchis, cupensula curent de colorare a suprafeelor. n mod prestabilit, aceast pensul are culoarea alb,aa c s-ar putea ca operaia s nu fie att de evident atunci cnd ncercai pentru prima dats utilizai aceste funcii. Dei, n sens strict, funciile aparin unei alte seciuni din capitolul defa, Desenarea suprafeelor pline", vom discuta acum despre fiecare.

    Funciile de mai sus sunt asemntoare prin faptul c sunt construite pe baza unui dreptunghide ncadrare" (bounding box"). Dumneavoastr definii o caset care ncadreaz obiectul -

    dreptunghiul de ncadrare - i Windows deseneaz obiectul n acest dreptunghi.

    Cea mai simpl dintre aceste funcii deseneaz un dreptunghi:

  • 7/21/2019 Prog. Windows Lab.2 Md

    9/19

    Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;

    Punctu cu coordonatele (xLeft, yTop) este punctul din stnga sus, iar punctul cu coordonatele(xRight, yBottom) este punctul din dreapta jos.

    Dup ce ai aflat cum se deseneaz un dreptunghi, folosind aceiai parametri, vei putea, la felde simplu, s desenai i o elips:

    Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;

    Funcia pentru desenarea unui dreptunghi cu colurile rotunjite folosete acelai dreptunghi dencadrare ca i funciileRectangleiEllipse,dar are nc doi parametri:

    RoundRect (hdc, xLeft, yTop, xRight, yBottom, xCornerEllipse, yCornerEllipse);

    Pentru desenarea colurilor rotunjite, Windows folosete o mic elips. Limea elipseiestexCornerEllipseiar nlimea acesteia esteyCornerEllipse.Colurile dreptunghiului sunt cuatt mai rotunjite cu ct valorile parametrilorxCornerEllipseiyCornerEllipsesunt mai mari.

    DacxCornerEllipseeste egal cu jumtate din diferenadintrexLeftixRightiaryCornerEllipseeste egal cu jumtate din diferena dintre yTop i yBottom,

    atunci funcia RoundRect va desena o elips.

    FunciileArc, Chordi Pie primesc aceiai parametri:

    Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

    Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

    Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);

    n cazul funcieiArc,Windows i-a terminat treaba, deoarece arcul este o linie eliptic, nu o

    suprafa plin. n cazul funciei Chord, Windows unete capetele arcului, iar n cazul funciei Pie,unete capetele arcului cu centrul elipsei. Interioarele suprafeelor nchise obinute astfel sunt

    colorate cu pensula curent.

    Folosirea penielor de stoc

    Atunci cnd apelai oricare dintre funciile de desenare a liniilor, Windows folosete pentru

    desenarea liniilor penia" (pen) curent selectat n contextul de dispozitiv. Penia selectatdetermin culoarea, limea i tipul de linie (acestea pot fi continue, punctate sau ntrerupte).

    Penia din contextul prestabilit de dispozitiv se numete BLACK_PEN. Aceasta deseneaz o liniecompact, de culoare neagr, cu grosimea de un pixel, indiferent de modul de mapare.

    BLACK_PEN este una dintre cele trei penie de stoc" (stock pen) furnizate de Windows.

    Celelalte dou penie de stoc sunt WHITE_PEN i NULL_PEN. NULL_PEN este o peni care nudeseneaz nimic. n plus, putei s creai penie proprii.

  • 7/21/2019 Prog. Windows Lab.2 Md

    10/19

    Penie sunt determinate de propriile variabile handle. n fiierele antet din Windows este definittipul de date HPEN, care reprezint o variabil handle a unei penie. Putei s definii o variabil(de exemplu, hPen) folosind aceast definiie de tip:

    HPEN hPen ;

    Putei s obinei variabila handle a uneia dintre peniele de stoc apelndfunciaGetStockObject.De exemplu, s presupunem c vrei s folosii penia de stoc numit

    WHITE_PEN. Obinei variabila handle a acesteia astfel:

    hPen = GetStockObject (WHITE_PEN);

    Apoi trebuie s selectai n contextul de dispozitiv penia a crei variabil ai obinut-o, apelndfunciaSelectObject:

    SelectObject (hdc, hPen) ;

    Dup acest apel toate liniile pe care le desenai vor folosi penia WHITE_PEN, pn cnd

    selectai o alt peni n contextul de dispozitiv sau tergei contextul de dispozitiv.

    n loc s definii explicit variabila hPen, putei s combinai

    funciileGetStockObjectiSelectObjectntr-o singur instruciune:

    SelectObject (hdc, GetStockObject (WHITE_PEN)) ;

    Dac apoi vrei s revenii la penia BLACK_PEN, putei s obinei o variabil handle a acesteiai s o selectai n contextul de dispozitiv tot cu o singur instruciune:

    SelectObject (hdc, GetStockObject (WHITE_PEN));

    FunciaSelectObjectreturneaz variabila handle a peniei selectate anterior n contextul de

    dispozitiv. Dac deschidei un nou context de dispozitiv i executai instruciunea:

    hPen = SelectObject (hdc, GetStockObject (WHITE_PEN)) ;

    atunci penia curent selectat n contextul de dispozitiv va fi WHITE_PEN i hPen va fi variabilahandle a peniei BLACK_PEN. Putei apoi s selectai penia BLACK_PEN n contextul dedispozitiv cu urmtoarea instruciune:

    SelectObject (hdc, hPen) ;

    Pentru a crea o peni proprie apelai funcia:

    hPen = CreatePen (iPenStyle, iWidth, rgbColor) ;

  • 7/21/2019 Prog. Windows Lab.2 Md

    11/19

    ParametruliPenStyleprecizeaz dac se deseneaz o linie continu, o linie punctat sau unantrerupt. ParametruliPenStylepoate fi unul dintre identificatorii definii n fiierele antet dinWindows.

    ParametrulrgbColordin funciaCreatePeneste un numr ntreg fr semn reprezentndculoarea peniei. Pentru toate stilurile de penie, exceptnd PS_INSIDEFRAME, atunci cndselectai penia n contextul de dispozitiv, Windows convertete acest parametru la cea maiapropiat culoare pur pe care o poate reprezenta dispozitivul de afiare. PS_INSIDEFRAMEeste singurul stil care poate folosi culori amestecate, dar numai pentru grosimi mai mari de un

    pixel.

    Desenarea suprafeelor pline

    Cele apte funcii Windows pentru desenarea figurilor sunt prezentate n tabelul urmtor:

    Funcia Figura

    Rectangle Dreptunghi cu coluri drepte

    Ellipse Elips

    RoundRect Dreptunghi cu coluri rotunjite

    Chord Arc pe circumferina unei elipse,

    avnd capetele unite printr-o coard

    Pie Suprafa de forma unei felii deplcint, reprezentnd un segmentde elips.

    Polygon Figur geometric avnd mai multe

  • 7/21/2019 Prog. Windows Lab.2 Md

    12/19

    laturi

    PolyPolygo

    n

    Mai multe figuri geometrice cu maimulte laturi

    Windows deseneaz conturul figurilor folosind penia curent selectat n contextul de dispozitiv.Pentru acest contur sunt folosite atributele stabilite pentru modul de desenare a fondului,culoarea fondului i modul de desenare, ca i n cazul desenrii unei linii simple. Tot ceea ce ainvat despre linii se aplic i n cazul contururilor.

    Figurile sunt umplute folosind pensula selectat n contextul de dispozitiv. n mod prestabilit,aceasta este pensula de stoc WHITE_BRUSH, ceea ce nseamn c interiorul figurilor va fiumplut cu alb. Windows definete ase pensule de stoc: WHITE-_BRUSH, LTGRAY_BRUSH,

    GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH i NULL_BRUSH (sau HOLLOW_BRUSH).

    Putei s selectai una dintre aceste pensule n contextul de dispozitiv la fel cum selectai openi de stoc. Windows definete tipul HBRUSH ca variabil handle a unei pensule, aa cputei s definii mai nti o variabil de acest tip:

    HBRUSH hBrush ;

    Putei s obinei variabila handle a pensulei de stoc GRAY_BRUSH apelnd

    funciaGetStockObject:.

    hBrush = Get&toCkObject (GBAY_BRUSH) ;

    Putei s o selectaiapoi n contextul de dispozitiv folosind funciaSelectObject:

    SelectObject (hdc, hBrush) ;

    Din acest moment, figurile desenate vor avea interiorul gri.

    Dac vrei s desenai o figur fr contur, selectai n contextul de dispozitiv penia NULL_PEN:

    SelectObject (hdc, GetStockObject (NULL_PEN)) ;

    Dac vrei s desenai o figur fr s i umplei interiorul, selectai n contextul de dispozitivpensula NULL_BRUSH:

    SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;

    Aa cum putei s creai penie proprii, putei s creai i pensule proprii.

  • 7/21/2019 Prog. Windows Lab.2 Md

    13/19

    Sistemele de coordonate ale dispozitivului

    Windows mapeaz coordonatele logice specificate n funciile GDI la coordonatele dispozitivului.

    nainte de a discuta despre sistemele de coordonate logice folosite de diferitele moduri demapare, vom discuta despre diferitele sisteme de coordonate de dispozitiv definite n Windowspentru zona de afiare. Dei n general am lucrat doar n zona client a ferestrei, n anumite

    situaii Windows folosete alte dou sisteme de coordonate de dispozitiv. n toate sistemele decoordonate de dispozitiv sunt folosii pixelii ca unitate de msur. Valorile de pe axa

    orizontal(x)cresc de la stnga la dreapta iar valorile de pe axa vertical (y) cresc de sus n jos.

    Atunci cnd folosim ntregul ecran, spunem c lucrm n coordonate ecran". Colul din stnga-sus este punctul de coordonate (0, 0). Coordonatele ecran sunt folosite n mesajul WM_MOVE(pentru alte ferestre dect ferestrele descendent) i n urmtoarele funcii

    Windows:CreateWinriowiMoveWindow(ambele pentru alte ferestre dect ferestreledescendent),GetMessagePos, GetCursorPos, SetCursorPos, GetWindowRect,

    WindowFromPointiSetBrushOrgEx.Acestea sunt funcii care fie nu au o fereastr asociat(cum ar fi cele dou funcii pentru cursor), fie trebuie s mute (sau s gseasc) o fereastr pebaza unui punct de pe ecran. Dac folosii funciaCreateDCcu parametrul DISPLAY ca sobinei un context de dispozitiv pentru ntregul ecran, atunci coordonatele logice specificate la

    apelarea funciilor GDI vor fi mapate la coordonatele ecranului.

    Coordonatele de fereastr" se refer la ntreaga fereastr a ecranului, inclusiv bara de titlu,

    meniu, barele de derulare i chenarul ferestrei. Pentru o fereastr normal, punctul (0, 0) estecolul din stnga-sus al chenarului de redimensionare. Coordonatele de fereastr sunt folositemai rar n Windows, dar dac obinei un context de dispozitiv cu ajutorul funciei GetWindowDC,atunci coordonatele logice specificate la apelarea funciilor GDI vor fi mapate la coordonateleferestrei.

    Al treilea sistem de coordonate de dispozitiv - cu care vom lucra cel mai des -folosetecoordonatele zonei client". Punctul (0,0) este colul din stnga-sus al zonei client. Dac obineiun context de dispozitiv cu ajutorul funcieiGetDCsau al funcieiBeginPaint, atunci coordonatele

    logice specificate Ia apelarea funciilor GDI vor fi mapate la coordonatele zonei client.

    Putei s transformai coordonatele zonei client n coordonatele ecranului i invers folosind

    funciileClientToScreeniScreenToClient. Deasemenea, putei obinei poziia i dimensiuneantregii ferestre n coordonate ecran folosind funciaGetWindowRect.

    -. /istin!ul ro!ramului

    #includeinti,j,dir;inta[3][6] ={ {123,343,1,163,232,166!,{12",1,12$,%4,234,2!,{1,2,3,4,1,4! !;intcircle&'()* hwnd,'*+ hdc,inti, intj, intdir, -+ rect,intnr/{

    '0-)hlue0en,hed0en,hellow0en,hreen0en,hiolet0en,h5rane0en;

  • 7/21/2019 Prog. Windows Lab.2 Md

    14/19

    '78'hedrush,hluerush,hellowrush,hreenrush,hioletrush,h5ranerush;

    hlue0en = +reate0en & 08985:*, 1, &2,,2/ /;hed0en = +reate0en & 08985:*, 1, &2,,/ /;hreen0en = +reate0en & 08985:*, 1, &,2,/ /;hellow0en = +reate0en & 08985:*, 1, &2,2,/ /;

    hiolet0en = +reate0en & 08985:*, 1, &2,,2/ /;h5rane0en = +reate0en & 08985:*, 1, &2,$,/ /;hedrush = +reate8olidrush &&2,,//;hluerush = +reate8olidrush &&,,2//;hreenrush = +reate8olidrush &&,2,//;hellowrush = +reate8olidrush &&2,2,//;hioletrush = +reate8olidrush &&2,,2//;h5ranerush = +reate8olidrush &&2,$,//;

    i&j1>rect.otto?/{i&dir==1/a[2][nr]=2;elsea[2][nr]=3;

    !i&i1>rect.riht/

    {i&dir==2/a[2][nr]=3;elsea[2][nr]=4;

    !i&j

  • 7/21/2019 Prog. Windows Lab.2 Md

    15/19

    *elete5ject&hreenrush/;*elete5ject&hellowrush/;*elete5ject&hluerush/;*elete5ject&hioletrush/;*elete5ject&h5ranerush/;returndir;

    !:-87: +D::D+E (nd0roc &'()*, 7), (0DDF, :0DDF/ ;int()D0 (inFain &')8D)+- hnstance, ')8D)+- h0reGnstance,

    08 sH+?d:ine, inti+?d8how/{

    static+'D sHD@@)a?e[] = -I &J(indows C :a2J/ ;'()* hwnd ;F8 ?s ;()*+:D88 wndclass ;wndclass.stKle = +89'-*D( L +89-*D( ;wndclass.l@n(nd0roc = (nd0roc ;wndclass.c+ls-Mtra = ;wndclass.c(nd-Mtra = ;wndclass.hnstance = hnstance ;

    wndclass.hcon = :oadcon &)7::, *9D00:+D5)/ ;wndclass.h+ursor = :oad+ursor &)7::, *+9D5(/ ;wndclass.hracBround = &'78'/ et8tocB5ject &('-978'/ ;wndclass.l@sHFenu)a?e = )7:: ;wndclass.l@sH+lass)a?e = sHD@@)a?e ;eister+lass&Nwndclass/;hwnd = +reate(indow &sHD@@)a?e,-I &JuleJ/, (895-:D00-*()*5(, +(978-*-OD7:, +(978-*-OD7:,+(978-*-OD7:, +(978-*-OD7:, )7::, )7::, hnstance, )7::/ ;i=1; dir=1;8how(indow &hwnd, i+?d8how/ ;7@date(indow &hwnd/ ;while&etFessae &N?s, )7::, , //

    { ranslateFessae &N?s/ ;*is@atchFessae &N?s/ ;

    !return?s.w0ara? ;

    !:-87: +D::D+E (nd0roc &'()* hwnd, 7) ?essae, (0DDF w0ara?, :0DDF l0ara?/{'*+ hdc ;

    staticintcMclient, cKclient;0D)87+ @s ;

    -+ rect;et+lientect&hwnd,Nrect/;switch&?essae/

    {case(F98P-AcMclient=:5(5*&l0ara?/;cKclient='(5*&l0ara?/;

    return;case(F90D)A

    hdc = ein0aint &hwnd, N@s/ ;

    nGalidateect &hwnd,)7::,7-/;circle&hwnd,hdc,a[][],a[1][],a[2]

    [],rect,/;circle&hwnd,hdc,a[][1],a[1][1],a[2]

    [1],rect,1/;

    circle&hwnd,hdc,a[][2],a[1][2],a[2][2],rect,2/;

  • 7/21/2019 Prog. Windows Lab.2 Md

    16/19

    circle&hwnd,hdc,a[][3],a[1][3],a[2][3],rect,3/;

    circle&hwnd,hdc,a[][4],a[1][4],a[2][4],rect,4/;

    circle&hwnd,hdc,a[][],a[1][],a[2][],rect,/;

    8lee@&1/;-nd0aint &hwnd, N@s/ ;

    return ;

    case(F9*-85A0ostQuitFessae &/ ;return ;!return*e(indow0roc &hwnd, ?essae, w0ara?, l0ara?/ ;!#includeinti,j,dir;inta[3][6] ={ {123,343,1,163,232,166!,{12",1,12$,%4,234,2!,{1,2,3,4,1,4! !;

    intcircle&'()* hwnd,'*+ hdc,inti, intj, intdir, -+ rect,intnr/{

    '0-)hlue0en,hed0en,hellow0en,hreen0en,hiolet0en,h5rane0en;

    '78'hedrush,hluerush,hellowrush,hreenrush,hioletrush,h5ranerush;

    hlue0en = +reate0en & 08985:*, 1, &2,,2/ /;hed0en = +reate0en & 08985:*, 1, &2,,/ /;hreen0en = +reate0en & 08985:*, 1, &,2,/ /;hellow0en = +reate0en & 08985:*, 1, &2,2,/ /;hiolet0en = +reate0en & 08985:*, 1, &2,,2/ /;h5rane0en = +reate0en & 08985:*, 1, &2,$,/ /;hedrush = +reate8olidrush &&2,,//;

    hluerush = +reate8olidrush &&,,2//;hreenrush = +reate8olidrush &&,2,//;hellowrush = +reate8olidrush &&2,2,//;hioletrush = +reate8olidrush &&2,,2//;h5ranerush = +reate8olidrush &&2,$,//;

    i&j1>rect.otto?/{i&dir==1/a[2][nr]=2;elsea[2][nr]=3;

    !i&i1>rect.riht/

    {i&dir==2/a[2][nr]=3;elsea[2][nr]=4;

    !

    i&j

  • 7/21/2019 Prog. Windows Lab.2 Md

    17/19

    case3A{a[][nr]CC; a[1][nr]CC;reaB;

    !case4A{

    a[][nr]CC; a[1][nr];reaB; !

    ! switch&nr/{caseA{8elect5ject&hdc,hellow0en/; 8elect5ject&hdc,hedrush/; reaB;!case 1A{8elect5ject&hdc,hlue0en/; 8elect5ject&hdc,hreenrush/; reaB;!case2A{8elect5ject&hdc,hed0en/ ; 8elect5ject&hdc,hellowrush/; reaB;!case3A{8elect5ject&hdc,hreen0en/; 8elect5ject&hdc,hluerush/; reaB;!case4A{8elect5ject&hdc,h5rane0en/; 8elect5ject&hdc,hioletrush/; reaB;!caseA{8elect5ject&hdc,hiolet0en/; 8elect5ject&hdc,h5ranerush/; reaB;!!-lli@se &hdc,a[][nr],a[1][nr],a[][nr]1,a[1][nr]1/;

    *elete5ject&hlue0en/;*elete5ject&hed0en/;*elete5ject&hellow0en/;

    *elete5ject&hreen0en/;*elete5ject&hiolet0en/;*elete5ject&h5rane0en/;

    *elete5ject&hedrush/;*elete5ject&hreenrush/;*elete5ject&hellowrush/;*elete5ject&hluerush/;*elete5ject&hioletrush/;*elete5ject&h5ranerush/;returndir;

    !:-87: +D::D+E (nd0roc &'()*, 7), (0DDF, :0DDF/ ;

    int()D0 (inFain &')8D)+- hnstance, ')8D)+- h0reGnstance,

    08 sH+?d:ine, inti+?d8how/{static+'D sHD@@)a?e[] = -I &J(indows C :a2J/ ;

    '()* hwnd ;F8 ?s ;()*+:D88 wndclass ;wndclass.stKle = +89'-*D( L +89-*D( ;wndclass.l@n(nd0roc = (nd0roc ;wndclass.c+ls-Mtra = ;wndclass.c(nd-Mtra = ;wndclass.hnstance = hnstance ;wndclass.hcon = :oadcon &)7::, *9D00:+D5)/ ;wndclass.h+ursor = :oad+ursor &)7::, *+9D5(/ ;wndclass.hracBround = &'78'/ et8tocB5ject &('-978'/ ;

    wndclass.l@sHFenu)a?e = )7:: ;wndclass.l@sH+lass)a?e = sHD@@)a?e ;eister+lass&Nwndclass/;hwnd = +reate(indow &sHD@@)a?e,-I &JuleJ/, (895-:D00-*()*5(, +(978-*-OD7:, +(978-*-OD7:,+(978-*-OD7:, +(978-*-OD7:, )7::, )7::, hnstance, )7::/ ;i=1; dir=1;8how(indow &hwnd, i+?d8how/ ;7@date(indow &hwnd/ ;while&etFessae &N?s, )7::, , //{

    ranslateFessae &N?s/ ;*is@atchFessae &N?s/ ;

    ! return?s.w0ara? ;!

  • 7/21/2019 Prog. Windows Lab.2 Md

    18/19

    :-87: +D::D+E (nd0roc &'()* hwnd, 7) ?essae, (0DDF w0ara?, :0DDF l0ara?/{'*+ hdc ;

    staticintcMclient, cKclient;0D)87+ @s ;

    -+ rect;

    et+lientect&hwnd,Nrect/;switch&?essae/{

    case(F98P-AcMclient=:5(5*&l0ara?/;cKclient='(5*&l0ara?/;

    return;case(F90D)A

    hdc = ein0aint &hwnd, N@s/ ;

    nGalidateect &hwnd,)7::,7-/;circle&hwnd,hdc,a[][],a[1][],a[2]

    [],rect,/;circle&hwnd,hdc,a[][1],a[1][1],a[2]

    [1],rect,1/;circle&hwnd,hdc,a[][2],a[1][2],a[2]

    [2],rect,2/;circle&hwnd,hdc,a[][3],a[1][3],a[2]

    [3],rect,3/;circle&hwnd,hdc,a[][4],a[1][4],a[2]

    [4],rect,4/;circle&hwnd,hdc,a[][],a[1][],a[2]

    [],rect,/;

    8lee@&1/;-nd0aint &hwnd, N@s/ ;

    return ;

    case(F9*-85A0ostQuitFessae &/ ;return ;!return*e(indow0roc &hwnd, ?essae, w0ara?, l0ara?/ ;!

    Rezultatele de executie :

  • 7/21/2019 Prog. Windows Lab.2 Md

    19/19

    +. Conclu0ie

    La elaborarea lucrrii de laborator am luat cunotin cu interfaa GDI i cu cteva funcii

    ale sale. Am desenat i redesenat cteva figurii astfel nct s obinem o animaiei.Eu am

    afacut vizualizarea a 6 figuri geometrice ce se misca in diferite directii