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