GDI Biblioteca GDI32 - profs.info.uaic.ro iasimin/pw/CDC_2006.pdf · 1. dispozitive rastru =...

download GDI Biblioteca GDI32 - profs.info.uaic.ro iasimin/pw/CDC_2006.pdf · 1. dispozitive rastru = reprezentare imagine prin matrice de puncte (placi video, ... • Linii si curbe: linii

of 21

  • date post

    05-Feb-2018
  • Category

    Documents

  • view

    218
  • download

    0

Embed Size (px)

Transcript of GDI Biblioteca GDI32 - profs.info.uaic.ro iasimin/pw/CDC_2006.pdf · 1. dispozitive rastru =...

  • 1

    GDI Biblioteca GDI32.DLL GDI = permite manipularea elementelor grafice independente de dispozitiv, este un sistem de afisare static, ce permite numai animatii simple; Dipozitive grafice de iesire:

    1. dispozitive rastru = reprezentare imagine prin matrice de puncte (placi video, imprimante matriciale, laser);

    2. dispozitive vectoriale = deseneaza imaginile prin linii = plottere; Sistem de coordonate virtual, sistem de coordonate al dispozitivului; W95 foloseste coordonate in numere intregi pe 16 biti, W_NT foloseste coordonate pe 32 biti; Din pdv al programatorului, interfata GDI este formata din citeva sute de rutine si unele tipuri de date, macroinstructiuni si structuri de date; Tipuri de apeluri de functii

    Functii care obtin (sau creaza) si elibereaza (sau distrug) un context de dispozitiv; (in API: BeginPaint ... EndPaint, GetDc, ReleaseDC; in MFC (clase): CDC, CPaintDC, CClientDC, CMetaFileDC, CWindowDC)

    Functii care obtin informatii despre contextul de dispozitiv - structura TEXTMETRICS, GetTextMetrics;

    Functii care deseneaza ceva (TextOut, DrawText, desenarea liniilor, a zonelor colorate si a imaginilor bitmap...);

    Functii care stabiliesc sau obtin atribute ale contextului de dispozitiv - Un atribut al DC specifica modul de lucru al functiilor de desenare; SetTextColor,... Toate atributele DC au valori prestabilite care devin active la obtinerea DC. Pentru fiecare functie de tip Set exista si o functie de tip Get, folosita pt. obtinerea valorilor curente ale atributelor DC.

    Functii care lucreaza cu obiecte GDI; Primitive GDI

    Linii si curbe: linii drepte, dreptunghiuri, elipse, arce. Liniile sint desenate folosind penita (HPEN, clasa CPen) curenta selectata in DC

    Suprafete pline: Suprafata poate fi umpluta folosind pensula GDI curenta (HBRUSH, clasa CBrush)

    Imagini bitmap: matrici dreptunghiulare de biti, care corespund pixelilor unui dispozitiv de afisare - pt. sisteme grafice de tip rastru. Imagini bitmap - dependente de dispozitiv si imagini bitmap independente de dispozitiv (DIB = Device Independent Bitmap) care pot fi stocate in fisiere.

    Text: afisarea textului este legata de fonturi (HFONT, clasa CFont). Alte aspecte ale GDI:

    Moduri de mapare si transformari: sitem de coordonate in pixeli, inci, mm Metafisiere (metafiles): o colectie de comenzi GDI stocate intr-o forma binara;

    sint folosite pentru transferarea reprezentarilor unor elemente grafice vectoriale prin intermediul memoriei temporare (clipboard).

  • 2

    Cai (paths): colectie de linii drepte si curbe stocate intern de GDI; pot fi folosite pt. desenare, umplere sau decupare.

    Decupare (clipping): desenarea poate fi limitata la o anumita sectiune a zonei client, numita zona de decupare - definita in general de o cale sau de o regiune.

    Tiparire (printing):

    Contextul de dispozitiv (DC): Modalitati de obtinere a variabilei handle a DC:

    Varainata 1(putem desena numai in regiunea invalida a ferestrei): la tratarea mesajului WM_PAINT:

    PAINTSTRUCT ps;

    hdc = BeginPaint (hwnd, &ps);

    ...

    EndPaint(hwnd, &ps);

    structura PAINTSTRUCT contine o structura de tip RECT rcPaint; care defineste dreptunghiul ce cuprinde regiunea invalida a zonei client a ferestrei; se valideaza regiunea invalida.

    Varianta 2 (putem desena in toata zona client a ferestrei; nu se valideaza regiunea invalida ale zonei client):

    hdc = GetDC(hwnd);

    ...

    ReleaseDC(hwnd, hdc);

    Varianta 3: (DC cuprinde in plus bara de titlu a ferestrei, barele de derulare si chenarul)

    hdc = GetWindowDC(hwnd);

    ...

    ReleaseDC(hwnd, hdc);

    Pentru folosirea acestei functii trebuie interceptat mesajul WM_NCPAINT ( non client paint).

    Varianta 4: CreateDC

    hdc = CreateDC(pszDriver, pszDevice, pszOutput,

    pData);

    ...

    DeleteDC(hdc);

    Pentru a obtine o variabila handle a DC pt. spatiul de afisare: hdc = CreateDC(DISPLAY, NULL, NULL, NULL);

  • 3

    Varianta 5: Obtinere informatii despre DC - CreateIC care are aceeasi parametri ca si CreateDC

    hdc = CreateIC(pszDriver, pszDevice, pszOutput,

    pData);

    ...

    DeleteDC(hdc);

    Varianta 6: context de dispozitiv in memorie - necesar la lucrul cu imagini

    bitmap:

    hdcmem = CreateCompatibleDC (hdc)

    ...

    DeleteDC(hdcMem);

    Crearea unui metafisier:

    hdcMeta = CreateMetaFile(pszFileName);

    ...

    hmf = CloseMetaFile(hdcMeta);

    Obtinere informatii despre contextul de dispozitiv: dimensiuni ecran (pixeli, fizice) posibilitati de folosire a culorilor, etc. cu functia GetDeviceCaps (get device capabilities); ivalue = GetDeviceCaps(hdc, iIndex);

    Atributele Contextului de Dispozitiv

    Cele mai uzuale atribute ale DC sunt date in urmatorul tabel:

    Attribute Default Set with Get with Text color Black CDC::SetTextColor CDC::GetTextColor Background color White CDC::SetBkColor CDC::GetBkColor Background mode OPAQUE CDC::SetBkMode CDC::GetBkMode Mapping mode MM_TEXT CDC::SetMapMode CDC::GetMapMode Drawing mode R2_COPYPEN CDC::SetROP2 CDC::GetROP2 Current position (0,0) CDC::MoveTo CDC::GetCurrentPosition Current pen BLACK_PEN CDC::SelectObject CDC::SelectObject Current brush WHITE_BRUSH CDC::SelectObject CDC::SelectObject Current font SYSTEM_FONT CDC::SelectObject CDC::SelectObject

    GDI Moduri de desenare functia SetROP2 Mod de desenare Operatii executate

    R2_NOP dest = dest R2_NOT dest = NOT dest

  • 4

    R2_BLACK dest = BLACK R2_WHITE dest = WHITE R2_COPYPEN dest = src R2_NOTCOPYPEN dest = NOT src R2_MERGEPENNOT dest = (NOT dest) OR src R2_MASKPENNOT dest = (NOT dest) AND src R2_MERGENOTPEN dest = (NOT src) OR dest R2_MASKNOTPEN dest = (NOT src) AND dest R2_MERGEPEN dest = dest OR src R2_NOTMERGEPEN dest = NOT (dest OR src) R2_MASKPEN dest = dest AND src R2_NOTMASKPEN dest = NOT (dest AND src) R2_XORPEN dest = src XOR dest R2_NOTXORPEN dest = NOT (src XOR dest)

    Moduri de mapare functia SetMapMode Mod de mapare Distanta ce corespunde la o

    unitate logica Axa x Axa y

    MM_TEXT Pixel spre dreapta in jos MM_LOMETRIC 0,1 mm spre dreapta in sus MM_HIMETRIC 0,01 mm spre dreapta in sus MM_LOENGLISH 0.01 inci spre dreapta in sus MM_HIENGLISH 0.001 inci spre dreapta in sus MM_TWIPS 1/1440 inci spre dreapta in sus MM_ISOTROPIC arbitrar (x = y) Selectabil selectabil MM_ANISOTROPIC Arbitrar (x!=y) Selectabil Selectabil

    Vizorul si fereastra SetWindowExt seteaza extensia ferestrei marimea dorita a ferestrei in unitati logice. SetViewportExt seteaza extensia vizorului marimea in pixeli a ferestrei in care desenam.. Marimea fereastrei este masurata in unitati logice. Marimea viewport-ului este masurata in unitati de dispozitiv, sau pixeli. In modul MM_ISOTROPIC ordinea de apel este SetWindowExt si apoi SetViewportExt. Exemple de cod CRect rect;

    GetClientRect (&rect);

    dc.SetMapMode (MM_ANISOTROPIC);

    dc.SetWindowExt (500, 500);

  • 5

    dc.SetViewportExt (rect.Width (), rect.Height ());

    dc.Ellipse (0, 0, 500, 500); Originea este in coltul din stanga sus. CRect rect;

    GetClientRect (&rect);

    dc.SetMapMode (MM_ANISOTROPIC);

    dc.SetWindowExt (500, -500);

    dc.SetViewportExt (rect.Width (), rect.Height ());

    dc.Ellipse (0, 0, 500, -500); Modul MM_ISOTROPIC CRect rect;

    GetClientRect (&rect);

    dc.SetMapMode (MM_ISOTROPIC);

    dc.SetWindowExt (500, 500);

    dc.SetViewportExt (rect.Width (), rect.Height ());

    dc.Ellipse (0, 0, 500, 500); Pentru vizor se folosesc coordonatele de dispozitiv (pixeli). Pentru toate modurile de mapare, Windows transforma coordonatele ferestrei (coordonate logice) in coordonate ale vizorului (coordonate de dispozitiv) folosind doua formule: xViewport = (xWindow - xWinOrg) * (xViewExt / xWinExt) + xViewOrg yViewport = (yWindow - yWinOrg) * (yViewExt / yWinExt) + yViewOrg unde (xWindow, yWindow) este punct in coordonate logice care trebuie translatat; (xViewport, yViewport) este punct in coordonate de dispozitiv; (xWinOrg, yWinOrg) = originea ferestrei in coordonate logice; (xViewOrg, yViewOrg) = originea vizorului in coordonate dispozitiv. Formulele de mai sus implica faptul ca punctul (xWinOrg, yWinOrg) este intotdeauna mapat la punctul (xViewOrg, yViewOrg). (xWinExt, yWinExt) = extensia ferestrei in coordonate logice; (xViewExt, yViewExt) = extensia vizorului in coordonate de dispozitiv; In majoritatea modurilor de mapare aceste extensii sint prestabilite si nu pot fi modificate. Raportul intre extensia vizorului si extensia ferestrei reprezinta un factor de scalare folosit pentru convertirea unitatilor logice in unitati de dispozitiv. Extensiile pot avea valori negative: aceasta inseamna ca nu este obligatoriu ca valorile pe axa x sa creasca spre dreapta si valorile pe axa y sa creasca in jos.

  • 6

    Functiile folosite pentru a realiza conversia intre puncte reprezentate in coordonate de dispozitiv in puncte reprezentate in coordonate logice si invers sunt:

    DPtoLP(hdc, pPoints, iNumber);

    LPtoDP(hdc, pPoints, iNumber);

    pPoints = matrice de structuri POINT iNumber = numarul de puncte care urmeaza a fi convertite. Daca dorim sa stim unde este punctul din centru in unitati MM_LOENGLISH, trebuie sa folosim DPtoLP : CRect rect;

    GetClientRect (&rect);

    CPoint point (rect.Width () / 2, rect.Height () / 2);

    CClientDC dc (this);

    dc.SetMapMode (MM_LOENGLISH);

    dc.DPtoLP (&point);

    DPtoLP va returna coordonatele punctului central in coordonate logice. Daca dorim sa stim coordonatele in pixeli al punctului de coordonate logice (