23.10.2014 Views

WinApi-grafika 2D

WinApi-grafika 2D

WinApi-grafika 2D

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5. Grafika 1/20<br />

Graphics Device Interface (GDI – interfejs urzdzenia graficznego) jest podsystemem<br />

Windows odpowiedzialnym za wywietlanie grafiki (włcznie z napisami) na ekranie i<br />

wydrukach.<br />

Kolory w Windows s pamitane w 32 bitowych liczbach całkowitych bez znaku (unsigned<br />

long) Opisujcy je typ danych ma nazw COLORREF. Warto tego typu zwraca makro<br />

RGB, które pobiera trzy argumenty reprezentujce barw czerwon, zielon i niebiesk:<br />

COLORREF RGB(BYTE byRed, BYTE byGreen, BYTE byBlue);<br />

Makrodefinicje: GetRValue, GetGValue, GetBValue pozwalaj obliczy z wartoci<br />

koloru RGB warto odpowiednich barw podstawowych (0-255).<br />

Przy omawianiu komunikatów poznalimy dwa podstawowe sposoby pobrania uchwytu<br />

kontekstu urzdzenia.<br />

Gdy program otrzymuje HDC, Windows tworzy kontekst urzdzenia przyjmujc wartoci<br />

domylne dla kadego jego atrybutu. W programie kad z tych wartoci mona odczyta lub<br />

zmieni.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 2/20<br />

Atrybut DC<br />

Tryb odwzorowania<br />

(mapping mode)<br />

Punkt pocztkowy<br />

okna (window origin)<br />

Punkt pocztkowy<br />

widoku (viewport<br />

origin)<br />

Rozcigło okna<br />

(window extents)<br />

Rozcigło widoku<br />

(viewport extents)<br />

Warto domylna Funkcja<br />

zmieniajca warto<br />

Funkcja zwracajca<br />

warto<br />

MM_TEXT SetMapMode GetMapMode<br />

(0, 0) SetWindowOrgEx<br />

OffsetWindowOrgEx<br />

GetWindowOrgEx<br />

(0, 0) SetViewportOrgEx GetViewportOrgEx<br />

OffsetViewportOrgEx<br />

(1, 1) SetWindowExtEx<br />

SetMapMode<br />

ScaleWindowExtEx<br />

(1, 1) SetViewportExtEx<br />

SetMapMode<br />

GetWindowExtEx<br />

GetViewportExtEx<br />

ScaleViewportExtEx<br />

Pióro (pen) BLACK_PEN SelectObject SelectObject<br />

Pdzel (brush) WHITE_BRUSH SelectObject SelectObject<br />

Czcionka (font) SYSTEM_FONT SelectObject SelectObject<br />

Mapa bitowa<br />

(bitmap)<br />

Bieca pozycja<br />

pióra<br />

Tryb malowania tła<br />

(background mode)<br />

Kolor tła<br />

(background color)<br />

Kolor napisów<br />

(text color)<br />

Tryb krelenia<br />

(drawing mode)<br />

Tryb rozcigania<br />

mapy bitowej<br />

(stretching mode)<br />

Tryb wypełniania<br />

wieloktów (polygon<br />

fill mode)<br />

Odstp midzy<br />

znakami<br />

Punkt pocztkowy<br />

pdzla (Brush<br />

Origin)<br />

Region obcinania<br />

(clipping region)<br />

Brak SelectObject SelectObject<br />

(0, 0) MoveToEx<br />

LineTo<br />

PolylineTo<br />

PolyBezierTo<br />

GetCurrentPositionEx<br />

OPAQUE SetBkMode GetBkMode<br />

Biały SetBkColor GetBkColor<br />

Czarny SetTextColor GetTextColor<br />

R2_COPYPEN SetROP2 GetROP2<br />

BLACKONWHIT<br />

E<br />

SetStretchBltMode<br />

GetStretchBltMode<br />

ALTERNATE SetPolyFillMode GetPolyFillMode<br />

0 SetTextCharacterExtr GetTextCharacterExtr<br />

a<br />

a<br />

(0, 0) SetBrushOrgEx GetBrushOrgEx<br />

Brak<br />

SelectObject<br />

SelectClipRgn<br />

IntersectClipRgn<br />

OffsetClipRgn<br />

ExcludeClipRect<br />

SelectClipPath<br />

GetClipBox<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 3/20<br />

W momencie gdy zwalniamy DC funkcjami EndPaint, ReleaseDC wszelkie zmiany<br />

atrybutów DC s tracone. Moemy je zapamita okrelajc w stylach klasy:<br />

CS_OWNDC –kade okno danej klasy bdzie miało swój własny DC. Kontekst ten bdzie<br />

istnie dopóki nie usuniemy okna, a jego atrybuty pozostan stałe, dopóki si ich jawnie nie<br />

zmieni.<br />

lub:<br />

CS_CLASSDC – dana klasa ma własny kontekst urzdzenia dzielony midzy wszystkie okna<br />

tej klasy.<br />

Czasami pojawia si konieczno zmiany atrybutów na krótka chwile i ponowne<br />

przywrócenie poprzednich atrybutów. Dokonamy tego stosujc funkcje:<br />

int iSaveID = SaveDC(hdc);<br />

// zmiana atrybutów i działania na zmienionym DC<br />

RestoreDC(hdc, -1);<br />

BOOL RestoreDC(HDC hdc, int nSavedDC)<br />

nSavedDC – wskazuje na stan DC do odtworzenia. Jeeli >0 wskazuje na warto zwrócon<br />

przez SaveDC, jeeli jest to warto ujemna wskazuje który zapisany DC ma odtworzy<br />

np. –1 spowoduje odtworzenie ostatnio zapisanego DC.<br />

W trakcie rysowania przyda si funkcja któr poznalimy wczeniej (w.2) zwracajca<br />

współrzdne obszaru roboczego okna w stosunku do lewego górnego rogu obszaru roboczego<br />

okna (lpRect.left = lpRect.top = 0)<br />

BOOL GetClientRect(HWND hWnd, LPRECT lpRect)<br />

funkcja odczytujca parametry systemu:<br />

int GetSystemMetrics(int nIndex);<br />

nIndex - indeks parametru, którego warto chcemy otrzyma, np. SM_CXSCREEN zwraca<br />

szeroko ekranu<br />

funkcja odczytujca lub ustawiajca zadany parametr<br />

BOOL SystemParametersInfo(UINT uiAction, UINT uiParam,<br />

PVOID pvParam,UINT fWinIni);<br />

uiAction - jaki parametr naley odczyta lub ustawi<br />

uiParam, pvParam - parametry zalene od podejmowanej akcji<br />

fWinIni - czy aktualizowa ustawienia (rozesłanie komunikatu: WM_SETTINGCHANGE)<br />

np. SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0) pobiera rozmiar<br />

obszaru roboczego (bez paska zada)<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 4/20<br />

Tryb odwzorowania.<br />

Wikszo współrzdnych i wymiarów uywanych we wszystkich funkcjach GDI jest<br />

wyraone w jednostkach logicznych. Windows zmienia jednostki logiczne na jednostki<br />

urzdzenia, czyli na piksele. Sposób zmiany współrzdnych zaley m.in. od trybu<br />

odwzorowania.<br />

Windows wyrónia osiem trybów odwzorowywania:<br />

Kierunek wzrostu wartoci<br />

Tryb odwzorowania Jednostki logiczne na osi x na osi y<br />

MM_TEXT (domylny) piksel w prawo w dół<br />

MM_LOMETRIC 0,1 mm w prawo do góry<br />

MM_HIMETRIC 0,01 mm w prawo do góry<br />

MM_LOENGLISH 0,01 cala w prawo do góry<br />

MM_HIENGLISH 0,001 cala w prawo do góry<br />

MM_TWIPS 1/1440 cala w prawo do góry<br />

MM_ISOTROPIC dowolne (x=y) do wyboru do wyboru -<br />

mona zmieni rozcigło okna/widoku<br />

MM_ANISOTROPIC dowolne (x!=y) do wyboru do wyboru -<br />

mona zmieni rozcigło okna/widoku<br />

int SetMapMode(HDC hdc, int iMapMode) – pozwala na zmian trybu<br />

odwzorowania..<br />

int GetMapMode(HDC hdc) – zwraca tryb odwzorowania.<br />

Tryb odwzorowania okrela odwzorowanie „okna” (współrzdne logiczne) na „widok”<br />

(współrzdne urzdzenia) za pomoc:<br />

xViewport =(xWindow – xWindOrg) * (xViewExt / xWinExt) +<br />

xViewOrg<br />

yViewport =(yWindow – yWindOrg) * (yViewExt / yWinExt) +<br />

yViewOrg<br />

xWindow, yWindow – przekształcany punkt we współrzdnych logicznych<br />

xViewport, yViewport – wynik przekształcenia we współrzdnych urzdzenia.<br />

xWindOrg, yWindOrg, xViewOrg, yViewOrg – pocztek okna i widoku<br />

xViewExt, yViewExt, xWinExt, yWindExt – rozcigło widoku i okna. Kada rozcigło z<br />

osobna nic nie znaczy, ale stosunek rozcigłoci widoku do rozcigłoci okna okrela czynnik<br />

skalujcy niezbdny do przeliczania.<br />

BOOL DPtoLP(HDC hdc, LPPOINT lpPoints, int iNumber) – funkcja<br />

przekształca iNumber punktów urzdzenia zawartych w tablic lpPoints na punkty logiczne.<br />

BOOL LPtoDP(HDC hdc, LPPOINT lpPoints, int iNumber) – funkcja<br />

przekształca iNumber punktów logicznych zawartych w tablic lpPoints na punkty urzdzenia.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 5/20<br />

Jeeli chcesz wywietli obraz w calach lub milimetrach bez zmiany trybu mona dziki<br />

funkcji GetDeviceCaps uzyska potrzebne informacje i samemu odpowiednio wyskalowa<br />

rysunek.<br />

int GetDeviceCaps(HDC hdc, int nIndex) – zwraca informacje na temat DC.<br />

nIndex – indeks danej o któr pytamy<br />

HORZSIZE – szeroko w mm<br />

VERTSIZE – wysoko w mm<br />

HORZRES – szeroko w pikselach<br />

VERTRES – wysoko w liniach rastra<br />

BITSPIXEL – liczba bitów na piksel (głbia koloru)<br />

PLANES – liczba warstw koloru<br />

NUMBRUSHES – liczba pdzli urzdzenia<br />

NUMPENS – liczba piór urzdzenia<br />

NUMMARKERS – liczba znaczników urzdzenia<br />

NUMFONTS – liczba czcionek urzdzenia<br />

NUMCOLORS – liczba kolorów urzdzenia<br />

PDEVICESIZE – rozmiar struktury urzdzenia<br />

ASPECTX – wzgldna szeroko piksela<br />

ASPECTY – wzgldna wysoko piksela<br />

ASPECTXY – wzgldna przektna piksela<br />

LOGPIXELSX – punkty na cal w poziomie<br />

LOGPIXELSY – punkty na cal w pionie<br />

SIZEPALETTE – liczba pozycji palety<br />

NUMRESERVED – zarezerwowane pozycje palety<br />

COLORRES – faktyczna rozdzielczo koloru<br />

BOOL ClientToScreen(HWND hwnd, LPPOINT lpPoint) – przekształca<br />

współrzdne wskazane przez lpPoint obszaru roboczego na współrzdne ekranu.<br />

BOOL ScreenToClient(HWND hwnd, LPPOINT lpPoint) – przekształca<br />

współrzdne ekranu na współrzdne obszaru roboczego.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 6/20<br />

Pióro.<br />

Do rysowania w kontekcie urzdzenia uywamy „pióra”. Pióro okrela kolor linii, jej<br />

grubo oraz styl (cigła, kropkowana, przerywana).<br />

W systemie mamy trzy predefiniowane pióra:<br />

BLACK_PEN – domylny, czarne cigłe linie gruboci jednego piksela.<br />

WHITE_PEN<br />

NULL_PEN – pióro jest przeroczyste.<br />

Oby otrzyma w programie predefiniowane pióro wykorzystujemy funkcje GetStockObject.<br />

HPEN hPen = GetStockObject(WHITE_PEN);<br />

Aby dane pióro było biece w kontekcie urzdzenia korzystamy z funkcji SelectObject.<br />

HPEN hPenOld = SelectObject(hdc, hPen);<br />

HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hGDIobj) – funkcja ustawia obiekt<br />

GDI w okrelonym kontekcie urzdzenia i zwraca uchwyt obiektu, który został zastpiony.<br />

Obiektem moe by bitmapa, czcionka, pióro, pdzel.<br />

HPEN CreatePen(int PenStyle, int iWidth, COLORREF rgbColor) -<br />

tworzy „pióro logiczne” które moe nastpnie by wybrane w DC przy pomocy SelectObject.<br />

PenStyle – okrela styl linii:<br />

PS_SOLID ______________<br />

PS_DASH __ __ __ __ __<br />

PS_DOT ............................<br />

PS_DASHDOT<br />

PS_DASHDOTDOT<br />

PS_NULL<br />

PS_INSIDEFRAME ______________ - odpowiada PS_SOLID. W przypadku prostokta<br />

jego wymiary s zmniejszane tak aby ramka mieciła si wewntrz podanych wymiarów.<br />

iWidth – dla PS_SOLID, PS_NULL i PS_INSIDEFRAME grubo linii. 0 oznacza jeden<br />

piksel.<br />

HPEN CreatePenIndirect( CONST LOGPEN * logpen) - tworzy „pióro<br />

logiczne” które moe nastpnie by wybrane w DC przy pomocy SelectObject, przy pomocy<br />

struktury LOGPEN.<br />

typedef struct tagLOGPEN {<br />

UINT PenStyle;<br />

POINT iWidth; // system ignoruje iWidth.y i bierze pod uwag jedynie<br />

iWidth.x<br />

COLORREF rgbColor;<br />

} LOGPEN, *PLOGPEN;<br />

HPEN ExtCreatePen(DWORD dwPenStyle, DWORD dwWidth, CONST<br />

LOGBRUSH * lplb, DWORD dwStyleCount, CONST DWORD *lpStyle) –<br />

tworzy rozszerzone pióro. Cz jego moliwoci nie jest wykorzystywana przy kreleniu<br />

zwykłych linii. Wicej jego właciwoci wykorzystywane jest przy kreleniu cieki za<br />

pomoc StrokePath.<br />

dwPenStyle – okrela styl linii. Mona połczy style uywane w CreatePen z stylami:<br />

PS_GEOMETRIC – dwWidth okrela grubo linii w jednostkach logicznych<br />

PS_COSMETIC – dwWidth musi si równa 1.<br />

PS_ENDCAP_ROUND – zaokrglone koce linii (domylne w CreatePen)<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 7/20<br />

PS_ENDCAP_SQUARE – koczy lini kwadratem wydłuajc lini o pół gruboci linii na<br />

kadym jej kocu.<br />

PS_ENDCAP_FLAT – koczy lini kwadratem<br />

PS_JOIN_ROUND – połczenia midzy liniami s zaokrglane (domylne w CreatePen)<br />

PS_JOIN_BEVEL – cina koce połczenia<br />

PS_JOIN_MITER – tworzy połczenie spiczaste<br />

lplp – wskanik na struktur opisujc pdzel. Jeeli styl jest PS_COSMETIC pole struktury<br />

lbStyle = BS_SOLID, a lbColor okrela kolor. Jeeli PS_GEOMETRIC – dowolne.<br />

Mona pobra informacje o piórze:<br />

GetObject(hPen, sizeof(LOGPEN), (LPVOID) &logpen);<br />

int GetObject(HGDIOBJ hGDIobj, int cbBuffor, LPVOID lpvObj) –<br />

funkcja zwraca informacje na temat obiektu GDI wypełniajc bufor przechowujcy<br />

informacje na temat obiektu.<br />

cbBuffor – okrela wielko bufora.<br />

Wszystkie utworzone przez uytkownika obiekty GDI musz by usunite.<br />

BOOL DeleteObject(HGDIOBJ hGDIobj);<br />

Nie wolno usuwa obiektów GDI w chwili gdy s wybrane w nie zwolnionym DC, oraz<br />

obiektów predefiniowanych.<br />

Przerwy w liniach, tło tekstu i pdzla jest wypełniane kolorem tła DC jeeli tryb tła jest<br />

ustawiony na OPAQUE. Jeeli tryb tła jest TRANSPARENT wówczas Windows pozostawia<br />

tło bez wypełnienia.<br />

int SetBkMode(HDC hdc, int iBkMode) – ustawia tryb tła (OPAQUE,<br />

TRANSPARENT)<br />

int GetBkMode(HDC hdc) – zwraca tryb tła (OPAQUE, TRANSPARENT)<br />

int SetBkColor(HDC hdc, COLORREF rgbColor) – ustawia kolor tła<br />

COLORREF GetBkColor(HDC hdc) – zwraca kolor tła.<br />

Tryb rysowania okrela wynik połczenia pikseli pióra i podłoa – kolor linii jest wynikiem<br />

działa logicznych na kolorze pióra i podłoa.<br />

R2_BLACK - 0 Piksel jest zawsze czarny<br />

R2_NOTMERGEPEN - ~(P|T) Piksel jest inwersj koloru uzyskanego trybem<br />

R2_MERGEPEN<br />

R2_MASKNOTPEN - ~P &T<br />

R2_NOTCOPYPEN - ~P Piksel jest inwersj koloru pióra<br />

R2_MASKPENNOT - P& ~T<br />

R2_NOT - ~T Piksel jest inwersj koloru tła<br />

R2_XORPEN - P^T<br />

R2_NOTMASKPEN - ~(P&T)<br />

R2_MASKPEN - P&T<br />

R2_NOTXORPEN - ~(P^T)<br />

R2_NOP - T Piksel pozostaje niezmieniony<br />

R2_MERGENOTPEN - ~P|T<br />

R2_COPYPEN - P Domylny. Piksel jest koloru pióra<br />

R2_MERGEPENNOT - P| ~T<br />

R2_MERGEPEN - P|T Piksel jest kombinacj koloru tła i pióra<br />

R2_WHITE - 1 Piksel jest zawsze biały<br />

int SetROP2(HDC hdc, int iDrawMode) – ustawia tryb rysowania.<br />

int GetROP2(HDC hdc) – zwraca tryb rysowania.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 8/20<br />

Pdzel.<br />

Do wypełniania obszarów uywamy „pdzla”. Pdzel jest map bitow o wymiarach 8 pikseli<br />

na 8 pikseli.<br />

W systemie mamy predefiniowane pdzle:<br />

WHITE_BRUSH – domylny, wypełnia obszar na biało.<br />

LTGRAY_BRUSH<br />

GRAY_BRUSH<br />

DKGRAY_BRUSH<br />

BLACK_BRUSH<br />

NULL_BRUSH = HOLLOW_BRUSH<br />

Mona wybra predefiniowany pdzel tak jak wybierało si predefiniowane pióro:<br />

HBRUSH hBrush = GetStockObject(GRAY_BRUSH);<br />

HBRUSH hBrushOld = SelectObject(hdc, hBrush);<br />

HBRUSH CreateSolidBrush(COLORREF rgbColor) – tworzy pdzel logiczny o<br />

okrelonym kolorze.<br />

HBRUSH CreateHatchBrush(int iHatchStyle, COLORREF rgbColor) –<br />

tworzy pdzel ze wzorem o okrelonym kolorze.<br />

iHatchStyle – okrela rodzaj wzoru:<br />

HS_HORIZONIAL<br />

HS_VERICAL<br />

HS_FDIAGONAL<br />

HS_BDIAGONAL<br />

HS_CROSS<br />

HS_DIAGCROSS<br />

Obszar midzy liniami jest wypełniany w zalenoci od koloru i trybu tła ( jak pióro z<br />

przerywanymi liniami).<br />

HBRUSH CreatePatternBrush(HBITMAP hBitmap) – tworzy pdzel w oparciu o<br />

map bitow.<br />

HBRUSH CreateBrushIndirect( CONST LOGBRUSH * logbrush) – tworzy<br />

pdzel w oparciu o struktur LOGBRUSH. Struktura składa si z trzech pól. Warto pola<br />

lbStyle okrela w jaki sposób Windows interpretuje pozostałe dwa pola<br />

LbSytle (UINT) lbColor (COLORREF)<br />

BS_SOLID kolor pdzla pomijane<br />

BS_HOLLOW pomijane pomijane<br />

lbHatch (LONG)<br />

BS_HATCHED kolor linii wzoru wzór wypełnienia<br />

BS_PATTERN pomijane uchwyt mapy bitowej<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 9/20<br />

Krelenie na ekranie :<br />

COLORREF SetPixel( HDC hdc, int X, int Y, COLORREF crColor) –<br />

ustawia piksel o okrelonym połoeniu na dany kolor<br />

COLORREF GetPixel( HDC hdc, int X, int Y) – zwraca kolor piksela o<br />

okrelonym połoeniu.<br />

Cz funkcji nie okrela miejsca od którego rozpoczyna krelenia. Korzysta z biecej<br />

pozycji pióra. Mona zmieni t pozycj za pomoc:<br />

BOOL MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint);<br />

lpPoint – zawiera poprzedni pozycj. Jeeli nie interesuje nas ta warto moemy poda<br />

NULL.<br />

Moemy pobra biec pozycj za pomoc:<br />

BOOL GetCurrentPositionEx(HDC hdc, LPPOINT lpPoint);<br />

BOOL LineTo(HDC hdc, int nXend, int nYend) – rysuje linie od biecej<br />

pozycji do punktu podanego w funkcji (ale bez tego punktu). Zmienia biec pozycj pióra<br />

na punkt podany w funkcji.<br />

BOOL Polyline(HDC hdc, CONST POINT *lppt, int cPoint) – funkcja<br />

kreli linie łczce kolejne punkty z tablicy punktów. Funkcja nie wykorzystuje, ani nie<br />

zmienia biecej pozycji pióra.<br />

cPoint – okrela ilo punktów w tablicy musi by wikszy od 1.<br />

BOOL PolylineTo(HDC hdc, CONST POINT *lppt, int cPoint) - funkcja<br />

kreli linie łczce kolejne punkty z tablicy punktów. Przy czym pierwszy punkt odpowiada<br />

biecej pozycji pióra; funkcja ustawia biec pozycj w jej punkcie kocowym.<br />

BOOL Rectangle(HDC hdc, int xLeft, int yTop, int xRight, int<br />

yBottom) – kreli prostokt za pomoc biecego pióra i wypełnia go za pomoc<br />

biecego pdzla.<br />

BOOL Ellipse(HDC hdc, int xLeft, int yTop, int xRight, int<br />

yBottom) – kreli elips za pomoc biecego pióra i wypełnia j za pomoc biecego<br />

pdzla. rodek elipsy odpowiada rodkowi podanego prostokta.<br />

BOOL RoundRect(HDC hdc, int xLeft, int yTop, int xRight, int<br />

yBottom, int xCornerEllipse, int yCornerEllipse) – kreli prostokt z<br />

zaokrglonymi wierzchołkami za pomoc biecego pióra i wypełnia go za pomoc biecego<br />

pdzla. xCornerEllipse i yCornerEllipse okrelaj szeroko i wysoko elipsy<br />

uytej do zaokrglania prostokta.<br />

BOOL Arc(HDC hdc, int xLeft, int yTop, int xRight, int<br />

yBottom, int xStart, int yStart, int xEnd, int yEnd) – kreli łuk,<br />

bdcy czci elipsy opisanej przez 4 pierwsze parametry prostokta. Pozostałe 4 okrelaj<br />

pocztek i koniec łuku bdcy przeciciem elipsy i prostej łczcej rodek elipsy i punkt<br />

pocztku / koca.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 10/20<br />

BOOL Chord(HDC hdc, int xLeft, int yTop, int xRight,<br />

int yBottom, int xStart, int yStart, int xEnd, int yEnd)<br />

– kreli łuk jak w funkcji Arc, oraz odcinek łczc koniec i pocztek łuku przy pomocy<br />

biecego pióra i wypełnia obszar pomidzy łukiem a odcinkiem za pomoc biecego<br />

pdzla.<br />

BOOL Pie(HDC hdc, int xLeft, int yTop, int xRight,<br />

int yBottom, int xStart, int yStart, int xEnd, int yEnd)<br />

– kreli łuk jak w funkcji Arc, oraz odcinki łczc koniec i pocztek łuku z rodkiem elipsy<br />

przy pomocy biecego pióra i wypełnia obszar pomidzy łukiem a odcinkami za pomoc<br />

biecego pdzla.<br />

BOOL PolyBezier(HDC hdc, Const POINT *lppt, DWORD cPoints)– kreli<br />

jedn lub wicej krzywych Beziera.<br />

lppt – wskanik na tablic punktów<br />

Pierwsza krzywa jest krelona od pierwszego do czwartego punktu, przy uyciu 2 i 3 punktu<br />

jako punktów kontrolnych ( które pełni rol magnesów odcigajcych lini od odcinka<br />

łczcego punkty kocowe). Kada kolejny segment krzywej potrzebuje trzech punktów.<br />

Punkt kocowy wczeniejszego segmentu jest punktem pocztkowym nastpnego.<br />

CPoints – ilo punktów w tablicy (3*ilo krzywych +1)<br />

BOOL PolyBezierTo(HDC hdc, Const POINT *lppt, DWORD cPoints)–<br />

kreli jedn lub wicej krzywych Beziera. Róni si od PolyBezier tym, e pierwszy punkt<br />

pocztkowy odpowiada biecej pozycji pióra. Funkcja ustawia biec pozycj w jej punkcie<br />

kocowym.<br />

BOOL Polygon(HDC hdc, CONST POINT *lppt, int cPoint) – funkcja kreli<br />

linie łczce kolejne punkty z tablicy punktów. Jeeli ostatni punkt z tablicy nie pokrywa si z<br />

pierwszym Windows dodaje odcinek zamykajcy figur. Nastpnie system wypełnia figur<br />

korzystajc z pdzla biecego w sposób zaleny od ustawionego trybu wypełniania<br />

wieloktów.<br />

cPoint – okrela ilo punktów w tablicy; musi by wikszy od 1.<br />

int SetPolyFillMode(HDC hdc, int iMode) – zmienia tryb wypełniania<br />

wieloktów w biecym DC.<br />

iMode – tryb wypełniania wieloktów:<br />

ALTRNATE – domylny. Obszar zostanie wypełniony jeli półprosta wyprowadzona z<br />

dowolnego punktu obszaru przetnie nieparzyst liczb krawdzi. Pozostałe obszary pozostan<br />

niewypełnione.<br />

WINDING – Windows wypełni wszystkie domknite obszary.<br />

int FillRect(HDC hdc, CONST RECT * rect, HBRUSH hBrush) –<br />

wypełnia obszar prostokta wskazany<br />

przez rect za pomoc podanego pdzla. Zawiera lew i górn krawd prostokta, nie zawiera<br />

krawdzi prawej i dolnej.<br />

int FrameRect(HDC hdc, CONST RECT * rect, HBRUSH hBrush) – maluje<br />

pdzlem prostoktn ramk,<br />

rodek pozostawiajc nie wypełniony.<br />

BOOL InvertRect(HDC hdc, CONST RECT * rect) – odwraca barw pikseli<br />

wewntrz prostokta.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 11/20<br />

Operacje na obiekcie typu RECT:<br />

BOOL SetRect(RECT *rect, int xLeft, int yTop, int xRight,<br />

yBottom) – funkcja ustawia pola<br />

obiektu typu RECT.<br />

BOOL OffsetRect(RECT *rect,int x,int y) –przesuwa prostokt o okrelon<br />

liczb jednostek wzdłu osi x i y.<br />

BOOL InflateRect(RECT *rect, int dx, int dy) – zwiksza lub zmniejsza<br />

rozmiary prostokta o okrelon<br />

liczb jednostek w obie strony.<br />

BOOL SetRectEmpty(RECT *rect) – wyzerowuje wszystkie pola zmiennej typu<br />

RECT.<br />

BOOL CopyRect(RECT *DestRect, RECT *SrcRect) – Kopiuje pola jednego<br />

prostokta do drugiego.<br />

BOOL IntersectRect(RECT *DestRect, RECT *SrcRect1, RECT<br />

*SrcRect2) – wylicza cz wspóln<br />

dwóch prostoktów.<br />

BOOL UnionRect(RECT *DestRect,RECT *SrcRect1,RECT *SrcRect2)-<br />

wylicza sum dwóch prostoktów.<br />

BOOL IsRectEmpty(RECT *rect)- zwraca TRUE jeeli wszystkie boki prostokta s<br />

zerowe.<br />

BOOL PtInRect(RECT *rect, POINT point)- zwraca TRUE jeeli punkt<br />

znajduje si wewntrz prostokta.<br />

Region.<br />

Region opisuje obszar powstały ze złoenia prostoktów, wieloktów i elips. Region<br />

podobnie jak pióro lub pdzel jest obiektem GDI. To znaczy mona go utworzy, pobra do<br />

niego uchwyt, a nastpnie naley go usun (DeleteObject(hRgn)).<br />

HRGN CreateRectRgn(int xLeft, int yTop, int xRight, int<br />

yBottom) – tworzy region w kształcie prostokta.<br />

HRGN CreateRectRgnIndirect(CONST RECT * rect) – tworzy region w<br />

kształcie prostokta.<br />

HRGN CreateEllipticRgn(int xLeft, int yTop, int xRight, int<br />

yBottom) – tworzy region w kształcie elipsy.<br />

HRGN CreateEllipticRgnIndirect(CONST RECT * rect) – tworzy region w<br />

kształcie elipsy.<br />

HRGN CreateRectRgn(int xLeft, int yTop, int xRight, int<br />

yBottom, int nWidthEllipse, int nHeightEllipse) – tworzy region w<br />

kształcie prostokta z zaokrglonymi rogami.<br />

HRGN CreatePolygonRgn(CONST POINT *lppt, int cPoint, int<br />

iPolyFillMode) – funkcja tworzy region w kształcie wielokta, powstałego w wyniku<br />

połczenia kolejnych punktów z tablicy punktów. Jeeli ostatni punkt z tablicy nie pokrywa<br />

si z pierwszym Windows dodaje odcinek zamykajcy figur.<br />

cPoint – okrela ilo punktów w tablicy; musi by wikszy od 1.<br />

iPolyFillMode – jest równy ALTRNATE lub WINDING i okrela które piksele nale do<br />

regionu.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 12/20<br />

int CombineRgn(HRGN hDestRgn, HRGN hSrcRgn1, HRGN hSrcRgn2,<br />

int iCombine) – funkcja składa dwa regiony dajc w wyniku uchwyt nowego regionu.<br />

Wszystkie trzy regiony musz istnie wczeniej, a region poprzednio opisywany przez<br />

hDestRgn zostanie usunity.<br />

iCombine – okrela sposób łczenia regionów<br />

RGN_AND – cz wspólna regionów<br />

RGN_OR – suma regionów<br />

RGN_XOR – suma regionów z wyłczeniem czci wspólnej<br />

RGN_DIFF – cz naleca do hSrcRgn1 i nie naleca do hSrcRgn2<br />

RGN_COPY – cało hSrcRgn1.<br />

Funkcja zwraca:<br />

NULLREGION – region pusty<br />

SIMPLEREGION – pojedynczy prostokt, wielokt lub elipsa<br />

COMPLEXREGION – złoenie prostoktów, wieloktów i elips.<br />

ERROR - błd<br />

BOOL FillRgn(HDC hdc,HRGN hrgn,HBRUSH hBrush) – wypełnia obszar<br />

regionu za pomoc podanego pdzla.<br />

BOOL FrameRect(HDC hdc, HRGN hrgn, HBRUSH hBrush, int nWidth,<br />

int nHeight) – maluje pdzlem ramk dookoła regionu, rodek pozostawiajc nie<br />

wypełniony.<br />

nWidth, nHeight – szeroko i wysoko ramki.<br />

BOOL InvertRgn(HDC hdc, HRGN hrgn) – odwraca barw pikseli wewntrz<br />

regionu.<br />

BOOL PaintRgn(HDC hdc, HRGN hrgn) – wypełnia region za pomoc biecego<br />

pdzla.<br />

Regiony moemy wykorzysta do ustawiania obszarów w którym mona malowa –<br />

regionów obcinania. Poza tymi obszarami Windows nic nie wykreli. Wykorzystujemy do<br />

tego funkcje<br />

uniewaniajc obszar: InvalidateRgn(HWND hWnd , HRGN hRgn, BOOL<br />

bErase ) i zatwierdzajc obszar ValidateRgn(HWND hWnd , HRGN hRgn).<br />

wyznaczajc obszar obcinania dla danego DC:<br />

HRGN SelectObject(HDC hdc, HRGN hRgn);<br />

int SelectClipRgn(HDC hdc, HRGN hRgn);<br />

cieka.<br />

cieka jest zbiorem odcinków i łuków pamitanych przez GDI. Podcieki składaj si z<br />

cigu połczonych linii. Kada podcieka moe by zamknita lub otwarta. Moemy<br />

zamkn podciek odcinkiem za pomoc funkcji:<br />

BOOL CloseFigure(HDC hdc)<br />

ciek tworzymy za pomoc funkcji:<br />

BeginPath(hdc);<br />

// funkcje krelce linie, odcinki, krzywe<br />

EndPath(hdc);<br />

Funkcje usuwajce definicj cieki:<br />

BOOL StrokePath(HDC hdc) – kreli ciek za pomoc biecego pióra.<br />

BOOL FillPath(HDC hdc) – zamyka odcinkiem kad otwart figur w ciece i<br />

wypełnia j uywajc pdzla biecego.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 13/20<br />

BOOL StrokeAndFillPath(HDC hdc) – kreli ciek za pomoc biecego pióra,<br />

zamyka odcinkiem kad otwart figur w ciece i wypełnia j uywajc pdzla biecego.<br />

HRGN PathToRegion(HDC hdc) – przekształca ciek w region<br />

BOOL SelectClipPath(HDC hdc, int iCombine) – definiuje obszar obcinania.<br />

iCombine – przyjmuje takie same wartoci jak iCombine w funkcji CombineRgn i okrela<br />

sposób w jaki cieka zostanie połczona z biecym regionem obcinania.<br />

Obrazy.<br />

Wyróniamy dwa sposoby przechowywania obrazów w programach: za pomoc map<br />

bitowych (cyfrowa reprezentacja obrazu) oraz metaplików (opisów obrazu).<br />

Liczba kolorów mapy bitowej jest równa 2 do potgi równej liczbie bitów przypadajcych na<br />

piksel (głbia koloru).(np. 16-kolorowa bitmapa– 4 bity na piksel).<br />

DDB.<br />

Do czasu Windows 3.0 mielimy do czynienia jedynie z bitmapami jako obiektami GDI. S to<br />

mapy monochromatyczne, albo mapy o takiej samej organizacji kolorów jak rzeczywiste<br />

graficzne urzdzenia wyjciowe ( monitor, drukarka), dla którego mapa była tworzona.<br />

Działanie na tych bitmapach jest jednak wygodniejsze i wydajniejsze ni na bitmapach<br />

niezalenych sprztowo, dlatego jeeli potrzebujesz mapy bitowej zgodnej z kart graficzn i<br />

wyłcznie na uytek twojego programu lepiej korzysta ze starszej wersji bitmapy.<br />

Funkcje tworzce mapy bitowe zalene od sprztu ( DDB):<br />

HBITMAP CreateBitmap(int cxWidth, int cyHeight, UINT iPlanes,<br />

UINT iBitsPixel, CONST VOID * lpBits)<br />

Pierwsze dwa argumenty odpowiadaj szerokoci i wysokoci bitmapy w pikselach, trzeci<br />

okrela liczb warstw barwnych, a czwarty głbi koloru. W rzeczywistoci trzeci i czwarty<br />

argument bd przyjmowa nastpujce wartoci:<br />

- iBitPixel = iPlanes =1 – bitmapa monochromatyczna<br />

- iBitPixel i iPlanes odpowiadaj wartociom danego DC, które mona pobra przy<br />

pomocy GetDeviceCap.<br />

lpBits- wskanik na tablic kolorów, uytych do utworzenia bitmapy. Jeeli równe NULL<br />

tworzymy nie zainicjowan map bitow.<br />

HBITMAP CreateCompatibeBitmap(HDC hdc, int cxWidth,<br />

int cyHeight)<br />

– na podstawie hdc Windows pobierze potrzebne informacje na temat warstw i głbi koloru.<br />

W tym przypadku mapa bitowa nie bdzie zainicjowana. Oprócz posiadania takiej samej<br />

organizacji barw jak DC bitmapa nie jest zwizana w inny sposób z DC.<br />

HBITMAP CreateBitmapIndirect(CONST BITMAP * bitmap)<br />

– tworzy bitmap w oparciu o struktur BITMAP.<br />

typedef struct tagBITMAP {<br />

LONG bmType; // Ustawione na 0<br />

LONG bmWidth; // Szeroko mapy bitowej w pikselach<br />

LONG bmHeight; // Wysoko mapy bitowej wyraona w wierszach pikseli<br />

LONG bmWidthBytes; // Szeroko mapy bitowej wyraona w bajtach – najmniejsza<br />

parzysta liczba bajtów potrzebna do<br />

// zapamitania jednego wiersza pikseli.<br />

WORD bmPlanes; // Liczba warstw barwnych<br />

WORD bmBitsPixel; // głbia koloru<br />

LPVOID bmBits; // Wskanik do tablicy bitów<br />

} BITMAP, *PBITMAP;<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 14/20<br />

Aby skopiowa zawarto tablicy zawierajcej bity mapy bitowej do istniejcej mapy bitowej<br />

naley uy funkcji:<br />

LONG SetBitmapBits(HBITMAP hBitmap, LONG dwCount, LPVOID<br />

pBitmap)<br />

dwCount - ilo bitów do przekopiowania do tablicy wskazanej przez pBitmap. Liczb<br />

wszystkich bitów w mapie bitowej mona wyliczy za pomoc wzoru:<br />

dwCount = (DWORD) bitmap.bmWidhtBytes * bitmap.bmHeight *<br />

bitmap.bmPlanes;<br />

Moemy pobra informacje o bitmapie za pomoc funkcji:<br />

GetObject(hBitmap, sizeof(BITMAP), (LPVOID) &bitmap) – funkcja<br />

kopiuje informacje do struktury BITMAP pozostawiajc pole bmBits puste.<br />

Aby otrzyma dostp do mapy bitowej naley wywoła funkcj:<br />

LONG GetBitmapBits(HBITMAP hBitmap, LONG dwCount, LPVOID<br />

pBitmap)<br />

W kontekcie zwykłego urzdzenia nie mona wybra mapy bitowej. Jest to moliwe jedynie<br />

w kontekcie urzdzenia pamiciowego. Kontekst urzdzenia pamiciowego ta taki DC, który<br />

ma „powierzchnie wywietlania” istniejc tylko w pamici komputera i moemy go<br />

utworzy za pomoc funkcji:<br />

HDC CreateCompatibleDC(HDC hdc) – funkcja tworzy DC pamiciowego , który ma<br />

“powierzchni wywietlania” zawierajc dokładnie 1 piksel monochromatyczny.<br />

Aby powikszy tak utworzony DC pamiciowego naley wybra map bitow w DC:<br />

SelectObject(hdcMem, hBitmap);<br />

Z tak utworzonym DC moesz robi to samo co z zwykłym DC – zmienia atrybuty,<br />

sprawdza ich wartoci, wybiera w kontekcie pióro, pdzel i regiony.<br />

Wszelkie zmiany poczynione na mapie bitowej pojawiaj si na powierzchni wywietlania<br />

DC pamiciowego. Wszystko co narysujesz w DC pamiciowego jest tak naprawd rysowane<br />

na mapie bitowej.<br />

Bitmap bdziemy wywietla w DC obszaru roboczego naszego okna przekazujc bity<br />

bitmapy midzy kontekstami urzdzenia.<br />

BOOL PatBlt(HDC hdc, int xDest, int yDest, int xWidth, int<br />

yHeight, DWORD dwROP) – funkcja rysuje prostokt uywajc biecego pdzla.<br />

Funkcja dokonuje operacji logicznych na kolorach pdzla i ekranu.<br />

xDst, yDst – punkt logiczny wskazujcy na lewy górny naronik prostokta dla trybu<br />

MM_TEXT. W pozostałych trybach naronik prostokta zale od znaku przy dwóch<br />

kolejnych parametrach.<br />

xWidth, yHeight – warto bezwzgldna z tych wartoci wyznacza szeroko i wysoko<br />

prostokta<br />

dwROP – okrela operacje wykonywane na kolorach pdzla i ekranu:<br />

BLACKNESS – wypełnia prostokt czarnym kolorem<br />

WHITENESS – wypełnia prostokt białym kolorem<br />

DSTINVERT – odwraca kolor ekranu<br />

PATINVERT – łczy kolory za pomoc operacji logicznej XOR (Pdzel ^ Ekran)<br />

PATCOPY – przekopiowuje kolory pdzla<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 15/20<br />

BOOL BitBlt(HDC hdcDest, int xDest, int yDest, int xWidth, int<br />

yHeight, HDC hdcSrc, int xSrc, int ySrc, DWORD dwROP) – funkcja<br />

przesyła bity kolorów okrelonego prostokta z DC ródłowego do<br />

DC docelowego. DC ródłowy moe równa si DC docelowy<br />

dwROP – okrela operacje wykonywane na kolorach pdzla hdcDest, ekranu i prostokta<br />

ródłowego.<br />

BLACKNESS – wypełnia prostokt czarnym kolorem<br />

WHITENESS – wypełnia prostokt białym kolorem<br />

DSTINVERT – odwraca kolor ekranu<br />

MERGECOPY – łczy kolor pdzla hdcDest z kolorem prostokta ródłowego przy pomocy<br />

operacji logicznej AND.<br />

MERGEPAINT – łczy odwrócone kolory prostokta ródłowego i kolory ekranu przy<br />

pomocy operacji logicznej OR.<br />

SRCCOPY – przekopiowuje kolory prostokta ródłowego<br />

NOTSRCCOPY – przekopiowuje odwrócone kolory prostokta ródłowego.<br />

SRCERASE - łczy odwrócone kolory ekranu i kolory prostokta ródłowego przy pomocy<br />

operacji logicznej AND<br />

NOTSRCERASE - łczy kolory ekranu i prostokta ródłowego przy pomocy operacji<br />

logicznej OR i odwraca wynik.<br />

PATINVERT – łczy kolory pdzla i ekranu za pomoc operacji logicznej XOR (Pdzel ^<br />

Ekran)<br />

PATCOPY – przekopiowuje kolory pdzla<br />

PATPAINT – łczy kolory pdzla i odwrócone kolory prostokta ródłowego przy pomocy<br />

operacji OR. Rezultat łczy z kolorami ekranu przy pomocy operacji OR.<br />

SRCAND – łczy kolory prostokta ródłowego i ekranu za pomoc operacji AND.<br />

SRCINVERT - łczy kolory prostokta ródłowego i ekranu za pomoc operacji XOR.<br />

SRCPAINT - łczy kolory prostokta ródłowego i ekranu za pomoc operacji OR.<br />

BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int<br />

xDestWidth, int yDestHeight, HDC hdcSrc, int xSrc, int ySrc,<br />

int xSrcWidth, int ySrcHeight, DWORD dwROP) – funkcja rozszerza<br />

moliwoci BitBlt o zmian wielkoci bitmapy z kontekstu urzdzenia docelowego.<br />

Umoliwia take odwrócenie obrazu : odbicie zwierciadlane ( jeeli xSrcWidth i xDestWidth<br />

po zmianie na współrzdne urzdzenia maj róne znaki) lub w kierunku góra-dół ( jeeli<br />

ySrcHeight i yDestHeight po zmianie na współrzdne urzdzenia maj róne znaki). To w<br />

jaki sposób funkcja zmniejsza obraz zaley od trybu rozcigania mapy bitowej (stretching<br />

mode) okrelanego dla kadego DC.<br />

Mona zmienia warto tego trybu za pomoc funkcji:<br />

int SetStretchBltMode(HDC hdc, int iMode)<br />

iMode:<br />

BLACKONWHITE = STRETCH_ANDSCANS – jeeli dwa lub wicej pikseli trzeba złczy<br />

w jeden piksel StretchBlt wykonuje na pikselach operacj koniunkcji (logiczne AND)<br />

WHITEONBLACK = STRETCH_ORSCANS - StretchBlt wykonuje na pikselach operacj<br />

alternatywy(logiczne OR)<br />

COLORONCOLOR = STRETCH_DELETESCANS – StretchBlt eliminuje wiersze lub<br />

kolumny bez wykonywania jakichkolwiek operacji logicznych.<br />

HALFTONE = STRETCH_HALFTONE – Windows oblicza redni kolor w oparciu o piksele<br />

które trzeba połczy.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 16/20<br />

DIB.<br />

W Windows 3.0 zdefiniowany został nowy format map bitowych DIB (device-independent<br />

bitmap) – mapy bitowe niezalene od sprztu. DIB posiada własn tabel barw która okrela<br />

metod przekodowania bitów piksela na kolory systemu RGB. Format DIB słuy głównie do<br />

wymiany obrazów midzy programami. Mona go zapisywa w pliku albo skopiowa do<br />

schowka. DIB nie jest obiektem GDI.<br />

Metapliki.<br />

Metapliki s binarnie zakodowanym zbiorem wywoła funkcji graficznych.<br />

Najpierw tworzymy kontekst urzdzenia metapliku za pomoc funkcji:<br />

HDC CreateMetaFile( LPCTSTR lpszFile)<br />

lpszFile – nazwa pliku (najczciej z rozszerzeniem WMF (windows metafile)) lub NULL.<br />

Jeeli NULL metaplik powstanie w pamici.<br />

Nastpnie krelimy w DC metapliku. Wszystkie wywołania funkcji GDI s zapisywane<br />

binarnie w metapliku.<br />

Kolejny etap to zamknicie kontekstu urzdzenia metapliku za pomoc funkcji:<br />

HMETAFILE CloseMetaFile(HDC hdcMeta) – funkcja zwraca uchwyt metapliku.<br />

Nastpnie moemy wywietli obraz zapamitany w metapliku w DC za pomoc funkcji:<br />

BOOL PlayMetaFile(HDC hdc, HMETAFILE hmf)<br />

Podobnie jak inne obiekty GDI, metapliki powinny zosta usunite przed zakoczeniem<br />

programu. W tym celu wywołujemy funkcje:<br />

BOOL DeleteMetaFile(HMETAFILE hmf)<br />

Z tworzonym w ten sposób plikami wi si pewne problemy. Na przykład program<br />

uywajcy metapliku utworzonego w innym programie nie moe w prosty sposób okreli<br />

wymiarów obrazu. Dlatego metapliki s rzadko wykorzystywane do wymiany rysunków<br />

midzy programami.<br />

W zwizku z typ powstał nowy format: „ulepszone metapliki” ( enhanced metafile – EMF)<br />

Tworzenie „ulepszonych metaplików” i ich wywietlanie przebiega podobnie jak starych<br />

metaplików.<br />

HDC CreateEnhMetaFile(HDC hdc, LPCTSTR lpszFile, CONST RECT *<br />

lpRect, LPCTSTR lpDescription)<br />

hdc – Windows wykorzystuje ten parametr do wstawienia do nagłówka metapliku informacji<br />

o wymiarach rysunku. Jeeli =NULL GDI pobierze odpowiednie informacje z kontekstu<br />

urzdzenia wywietlajcego.<br />

lpRect – wskazuje na prostokt wyznaczajcy całkowite wymiary metapliku. Jeeli =NULL<br />

to GDI okreli te wymiary.<br />

lpDescription – tekst opisujcy metaplik. Składa si z dwóch czci. Pierwsza zakoczona 0<br />

zawiera nazw aplikacji, druga zakoczona dwoma zerami opisuje rysunek. Moe równa si<br />

NULL.<br />

HENHMETAFILE CloseEnhMetaFile(HDC hdcEMF)- funkcja usuwa uchwyt DC<br />

metapliku otrzymujc w zamian uchwyt metapliku.<br />

BOOL PlayEnhMetaFile(HDC hdc, HENHMETAFILE hmf, CONST RECT *<br />

lpRect)<br />

lpRect – prostokt do którego GDI dopasowuje rysunek.<br />

BOOL DeleteEnhMetaFile(HENHMETAFILE hmf) – usuwa metaplik z pamici<br />

HENHMETAFILE GetEnhMetaFile(LPCTSTR lpszFile) – funkcja zwraca uchwyt<br />

do metapliku na dysku.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 17/20<br />

UINT GetEnhMetaFileHeader(HENHMETAFILE hemf, UINT cbSize,<br />

LPENHMETAHEADER emh) – funkcja zwraca informacje z nagłówka metapliku.<br />

cbSize – okrela w wielko bufora na dane.<br />

emh – wskanik na struktur ENHMETAHEADER, jeeli =NULL funkcja zwraca wielko<br />

rekordu nagłówkowego<br />

Uyteczne pola ENHMETAHEADER:<br />

RECT rclBounds – zawiera wymiary rysunku w pikselach<br />

RECT rclFrame – zawiera wymiary rysunku w setnych czciach milimetra.<br />

UINT GetEnhMetaFileDescription(HENHMETAFILE hemf, UINT<br />

sizechBuffer, LPTSTR lpszDescription) – wypełnia bufor opisem metapliku.<br />

Jeeli lpszDescription=NULL funkcja zwraca długo opisu.<br />

Teksty i czcionki<br />

Funkcja wywietlajc tekst:<br />

BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR<br />

lpString, int cbString)<br />

hdc – uchwyt kontekstu urzdzenia<br />

nXStart – punkt pocztkowy napisu na osi poziomej okrelany wzgldem lewego górnego<br />

rogu obszaru roboczego<br />

nYStart - punkt pocztkowy napisu na osi pionowej okrelany wzgldem lewego górnego<br />

rogu obszaru roboczego<br />

lpString – wskanik do cigu znaków.<br />

cbString – liczb znaków w cigu.<br />

Funkcja okrelajca połoenie napisów, zmieniajca domylne znaczenie parametrów<br />

nXStart, nYStart z funkcji TextOut. :<br />

UINT SetTextAlign(HDC hdc, UINT fmode)<br />

fmode:<br />

TA_LEFT – domylny; wyrównuje tekst do lewej krawdzi. nXStart wskazuje na punkt od<br />

którego rozpoczynamy pisanie.<br />

TA_RIGHT – łacuch znaków dosunity praw krawdzi ostatniego znaku do punktu o<br />

współrzdnej poziomej nXStart.<br />

TA_CENTER – współrzdna nXStart wyznacza rodek krelonego napisu<br />

TA_TOP – domylny; nYStart wyznacza górn krawd znaków<br />

TA_BOTTOM – wszystkie znaki cigu znajduj si powyej rzdnej nYStart<br />

TA_BASELINE – podstawa wywietlania tekstu (linia która biegnie wzdłu podstawy liter<br />

nie majcych tzw. wydłue dolnych np. (wydłuenia maj np.: y,p,g)) znajdzie si na rzdnej<br />

nYStart<br />

TA_UPDATECP – system ignoruje nXStart i nYStart, a zamiast nich uyje biecej pozycji<br />

pióra. Dla tego stylu TextOut<br />

ustawi biec pozycj pióra na koniec wykrelonego teksu (dla TA_LEFT) lub na jego<br />

pocztku (dla TA_RIGHT)<br />

BOOL SetTextJustification(HDC hdc, int nExtra, nBrakCount); -<br />

ustawia wielko przestrzeni jak trzeba rozłoy midzy przerwy w tekcie.<br />

nExtra – okrela przestrze jak trzeba rozłoy pomidzy przerwy w łacuchach znaków.<br />

NBreakCount – liczba przerw w łacuch, do których naley doda woln przestrze.<br />

Zaczynajc nowy wiersz jeeli wczeniej uyto tej funkcji naley ustawi przerwy:<br />

SetTextJustification(hdc, 0,0);<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 18/20<br />

Funkcja wywietla tekst zamieniajc umieszczone w tekcie znaki tabulacji (‘\t’ lub 0x09) na<br />

odstpy okrelone w tablicy liczb całkowitych:<br />

LONG TabbedTextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR<br />

lpString, int cbString, int iNumTab, CONST LPINT piTabStops,<br />

int xTabOrgin)<br />

iNumTab – liczba znaków tabulacji<br />

piTabStops – tablica współrzdnych tabulacji wyraonych w pikselach<br />

Jeeli iNumTab=0 i piTabStops=NULL system ustawia tabulatory co 8 znak (w oparciu o<br />

redni szeroko znaku)<br />

Jeeli iNumTab=1 to piTabStops zawiera liczb okrelajc odstp pomidzy kolejnymi<br />

tabulatorami.<br />

xTabOrgin – wskazuje na punkt na os x od którego nastpi odmierzanie tabulatorów.<br />

Jeeli funkcja zakoczy si sukcesem zwraca rozmiar napisu HIWORD(wynik) – wysoko,<br />

LOWORD(wynik) - szeroko<br />

BOOL ExtTextOut(HDC hdc, int nXStart, int nYStart, UINT<br />

iOptions, CONST RECT *rect, LPCTSTR lpString, UINT cbString,<br />

CONST INT *lpDx)<br />

iOptions – okrelaj w jaki sposób interpretowa prostokt rect. Moe by równe 0.<br />

ETO_CLIPPED – rect jest to prostokt obcinania<br />

ETO_OPAQUE – rect – prostoktne tło, które zostanie wypełnione kolorem tła biecego.<br />

lpDx – wskazuje na tablic liczb całkowitych okrelajcych odstpy pomidzy kolejnymi<br />

znakami w cigu. Jeeli ten parametr równa si NULL domylny odstp zostanie<br />

zastosowany..<br />

Funkcja wywietlajca sformatowany tekst w podanym prostokcie:<br />

BOOL DrawText(HDC hdc, LPCTSTR lpString, int cbString, LPRECT<br />

lpRect, UINT iFormat)<br />

Jeeli cbString =-1 i lpString jest cigiem zakoczonym 0 to Windows sam obliczy długo<br />

znaku.<br />

iFormat – okrela sposób formatowania tekstu:<br />

0 – system interpretuje tekst jako zbiór wierszy oddzielonych znakiem powrotu karetki (‘\r’<br />

lub 0x0D) lub znakiem nastpnej linii (‘\n’ lub 0x0A).<br />

DT_LEFT – domylny. Wyrównanie lewostronne tekstu<br />

DT_RIGHT – wyrównanie prawostronne<br />

DT_CENTER – wyrodkowuje tekst pomidzy lewym i prawym bokiem prostokta<br />

DT_SINGLELINE – nie interpretuje znaków powrotu karetki oraz przejcia do nastpnej linii<br />

jako znaki koca wiersza<br />

DT_TOP – domylny; wyrównuje tekst do górnej czci prostokta.<br />

DT_BOTTOM – wyrównanie do dolnej czci prostokta<br />

DT_VCENTER – wyrównanie tekstu pomidzy dolnym i górnym bokiem prostokta<br />

DT_WORDBREAK – wymusza łamanie wiersza po dojciu do krawdzi prostokta.<br />

DT_NOCLIP – kreli tekst bez obcinania fragmentów nie mieszczcych si w prostokcie<br />

DT_EXTERNALLEADING – odstpy midzy wierszami wysokoci znaku bez pominicia<br />

dodatkowego odstpu zalecanego przez projektanta czcionki.<br />

DT_EXPANDTABS - interpretuje znaki tabulacji. Domylnie znaki tabulacji wystpuj w<br />

odstpach równych omiokrotnej redniej szerokoci znaku.<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 19/20<br />

Napisy s wywietlane dla danego kontekstu urzdzenia. Kilka atrybutów DC dotyczy<br />

napisów.<br />

Kolor liter domylnie jest czarny zmieniamy go za pomoc funkcji:<br />

COLORREF SetTextColor(HDC hdc, COLORREF rgbColor) – funkcja zwraca<br />

poprzedni kolor tekstu.<br />

COLORREF GetTextColor(HDC hdc) – funkcja zwraca biecy kolor napisów.<br />

Odstp midzy znakami jest wypełniony kolorem uzalenionym od trybu tła oraz koloru tła.<br />

Mona korzysta z kolorów systemowych pobieranych przy pomocy funkcji:<br />

GetSysColor(int nIndex)<br />

m.in nIndex moe by równe:<br />

COLOR_GRAYTEXT – szary (nieaktywny) kolor<br />

COLOR_HIGHLIGHT – kolor uywany do zaznaczania wybranego elementu w kontrolce<br />

COLOR_HIGHLIGHTTEXT – kolor tekstu uywany do zaznaczania wybranego elementu w<br />

kontrolce<br />

COLOR_WINDOW – tło okna<br />

COLOR_WINDOWTEXT – kolor tekstu w oknie<br />

Copyright © 2001-2003 Ewa Lach


5. Grafika 20/20<br />

Czcionki.<br />

Mona pobra predefiniowane czcionki systemowe:<br />

HFONT hFont = GetStockObject(iFont);<br />

iFont równa si SYSTEM_FONT (domylna czcionka – o proporcjonalnej szerokoci liter)<br />

lub SYSTEM_FIXED_FONT(o takiej samej szerokoci znaków)<br />

SelectObject(hFont);<br />

Czcionki GDI znajdujce si w plikach na dysku twardym dziel si na trzy kategorie:<br />

Rastrowe – kady znak jest zakodowany w postaci wzorca pikseli; „nieskalowalnymi” bez<br />

pogorszenia jakoci; wydajno; dobra czytelno.<br />

Wektorowe – znak w postaci zbioru połczonych odcinków. – niska wydajno wywietlania,<br />

czytelno słaba przy małych wymiarach; przy duych brzydkie; Skalowalne.<br />

TrueType – zdefiniowane przez kontur składajcy si z odcinków i łuków. Kontur jest<br />

wykorzystywany do stworzenia mapy bitowej znaku.<br />

Windows 95 był wyposaony w 13 czcionek TrueType w kolejnych wersjach Windows lista<br />

czcionek uległa powikszeniu.<br />

(Courier New , Courier New Bold, Courier New Italic, Courier<br />

New Bold Italic, Times New Roman, Times New Roman Bold, Times New Roman<br />

Italic, Times New Roman Bold Italic, Arial, Arial Bold, Arial Italic, Arial Bold Italic,<br />

Symbol).<br />

HFONT CrateFontIndirecta(LPLOGFONT lplf)<br />

typedef struct tagLOGFONT {<br />

LONG lfHight // podana wysoko czcionki w jednostkach logicznych. Jeeli =0<br />

system uywa domylnej wielkoci<br />

LONG lfWidth // szeroko<br />

LONG lfEscapement<br />

LONG lfOrientation<br />

LONG lfWeight // grubo czcionki (np. FW_DONTCARE=0, FW_NORMAL=400,<br />

FW_BOLD=700,..)<br />

BYTE lfItalic // kursywa jeeli !=0<br />

BYTE lfUnderline<br />

BYTE lfStrikeOut<br />

BYTE lfCharSet<br />

BYTE lfOutPrecision<br />

BYTE lfClipPrecision<br />

BYTE lfQuality<br />

BYTE lfPitchAndFamily<br />

TCHAR lfFaceName<br />

} LOGFONT, *PLOGFONT<br />

Aby wybra czcionk TrueType wikszo wartoci powinna by równa 0.<br />

BOOL GetTextExtentPoint32(HDC hdc, LPCTSTR lpString, int<br />

iCount, LPSIZE lpSize) – funkcja podaje szeroko i wysoko łacucha znaków na<br />

podstawie biecej czcionki w DC.<br />

Struktura SIZE składa si z dwóch pól typu LONG cx, cy.<br />

Copyright © 2001-2003 Ewa Lach

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!