Mamy jeszcze kilka funkcji związanych z regionami GDI.
Rysowanie z użyciem regionów
Regiony mogą służyć do rysowania za pośrednictwem tych funkcji:
¾ PaintRgn() wypełnia region pędzlem wybranym w kontekście urządzenia
¾ FillRgn() wypełnia region podanym pędzlem
¾ FrameRgn() kreśli obramowanie wokół regionu przy użyciu podanego pędzla
¾ InvertRgn() odwraca kolory (jak InvertRect()) w obszarze regionu
Regiony i okna
Do łączenia regionów i okien służą funkcje:
¾ SetWindowRgn() ustawia nowy region, wyznaczający kształt okna
¾ GetWindowRgn() pobiera region okna
***
Zakańczamy już ten przydługi wstęp do opisu biblioteki Windows GDI. W następnym podrozdziale zajmiemy się już konkretami, czyli rysowaniem prymitywów. Wreszcie więc ujrzymy cokolowiek na naszych ekranach :)
Prymitywy
To, czym się teraz będzię zajmowac, dla wielu programistów (głównie niezbyt zaawansowanych) jest niemal tożsame z całą biblioteką GDI. Jak wiemy, nie jest to prawda, jednak nie da się ukryć, że prymitywy graficzne są jej najważniejszą częścią. To przecież naturalne, że narzędzie graficzne oceniamy przede wszystkim po tym, co
możemy przy jego pomocy rysować. Bogate możliwości wyświetlania kształtów graficznych są więc niezwykle ważne.
Window GDI jest pod tym względem bardzo rozwiniętą biblioteką, mogącą zarówno kreślić zgeometryzowane kształty figur, jak również rastrowe bitmapy czy wreszcie napisy tekstowe. Dla każdego z tych prymitywów istnieje poza tym wiele opcji regulujących ich prezencję.
Niniejszy podrozdział poświęcimy tym strategicznym elementom GDI, jakimi są prymitywy. Omówimy tu osobno figury geometryczne, bitmapy oraz tekst.
Figury geometryczne
Najbardziej wektorowy charakter ze wszystkich prymitywów w Windows GDI zachowują figury geometryczne. Są one całkowicie niewrażliwe na skalowanie czy przesunięcie, zatem mogą być rysowane w dowolnym rozmiarach i w dowolnych miejscu.
W matematyce figury na płaszczyźnie są opisane odpowiednimi równaniami, ale nie musimy ich znać, aby rysować takie kształty. Biblioteka GDI zawiera sporo funkcji wyręczających nas w tym zadaniu - wiele z nich poznamy w tej sekcji.
Zanim jednak to się stanie, musimy sobie powiedzieć co nieco o dwóch ważnych obiektach, które wiążą się z kwestią rysowania figur geometrycznych w Windows GDI.
Tymi obiektami są pióra i pędzle.
Pióro
GDI pozwala na rysowanie linii prostych oraz krzywych. Takie linie mogą mieć określone atrybuty, jak na przykład kolor. Decyduje o nich obiekt kontekstu urządzenia zwany piórem.
Pióro (ang. pen) kontroluje właściwości rysowanych linii: ich grubość, kolor (ewentualnie deseń) oraz styl.
Pióra są w GDI reprezentowane poprzez uchwyty typu HPEN.
Chcąc zatem rysować różne typy linii, musimy odpowiednio zmodyfikować właściwości pióra. Jest ich niewiele, więc w GDI najczęściej będziemy po prostu tworzy nowe, swoje własne pióro i wybierać je dla danego kontekstu urządzenia. Po tym wszystkie linie będą kreślone przy użyciu tego właśnie nowowybranego pióra.
Korzystanie z piór
Typowa kolejność kroków przy korzystaniu z własnego pióra sprowadza się zatem do:
¾ stworzenia pióra
¾ wybrania go w używanym kontekście urządzenia
¾ narysowania figur
¾ odłożenia pióra z kontekstu, czyli wybranie w nim poprzednio ustawionego pióra
¾ usunięcia pióra
Wyjaśnimy sobie tutaj każdy z tych kroków, oczywiście z wyjątkiem samego rysowania figur, gdyż to jest tematem prawie całej pozostałej części sekcji.
Tworzenie pióra
Do utworzenia nowego pióra możemy wykorzystać funkcję CreatePen() i tak też będziemy czynić najczęściej. Oto prototyp tej funkcji:
HPEN CreatePen(int fnPenStyle, int nWidth,
COLORREF crColor);
Umożliwia ona stworzenie pióra kreślącego linie o podanej grubości, kolorze i stylu. Te cechy pióra wyznaczają trzy parametry funkcji:
typ parametr opis
fnPenStyle Ten parametr okresla styl pióra, tj. rysowanych przy jego pomocy linii. Możliwe wartości ujmuje następna tabelka.
int
nWidth
Tutaj podajemy grubość linii pióra w jednostkach logicznych.
Jeżeli chcemy użyć innego stylu pióra niż domyślny jednolity (PS_SOLID, ewentualnie także PS_INSIDEFRAME), to najlepiej podać tu 0, gdyż jeśli szerokość linii przekroczy jedną jednostkę
urządzenia (zwykle piksel), inny styl niż
PS_SOLID/PS_INSIDEFRAME nie będzie mógł być zastosowany i zostanie wybrany PS_SOLID. W przypadku podania zera grubość
linii wyniesie natomiast jeden piksel i wszystko będzie w porzadku, niezależnie od wartości fnPenStyle.
COLORREF crColor W tym parametrze określamy kolor linii rysowanych przez pióro.
Tabela 61. Parametry funkcji CreatePen()
Czym jest styl pióra?… To po prostu pewien sposób na okreslenie ciągłości linii. GDI udostępnia kilka takich styli, przedstawia je poniższa tabelka:
flaga styl linia PS_NULL brak linii
PS_SOLID linia ciągła
PS_DASH linia przerywana (kreski) PS_DOT linia kropkowana PS_DASHDOT kreska-kropka PS_DASHDOTDOT kreska-kropka-kropka PS_INSIDEFRAME linia ciągła
Tabela 62. Style zwykłych piór w Windows GDI
Ostatni styl PS_INSIDEFRAME wygląda jak pierwszy, ale jest między nimi pewna różnica.
Uwidacznia się ona przy obrysowywaniu regionów: PS_INSIDEFRAME generuje ramkę zawierającą się w całości wewnątrz regionu, zaś PS_SOLID - na zewnątrz.
Popatrzmy teraz na przykłady wykorzystania funkcji CreatePen() do tworzenia piór:
// tworzy pióro rysujące grubą czarną kreską
HPEN hpenCzarnyFlamaster = CreatePen(PS_SOLID, 5, 0x0);
// pióro kreślone najcieńszą możliwą, czerwoną linię
HPEN hpenCienkaCzerwonaLinia = CreatePen(PS_SOLID, 0, RGB(255, 0, 0));
// bardzo gruba linia w kolorze zielonym
HPEN hpenPasZieleni = CreatePen(PS_SOLID, 10, RGB(0, 255, 0));
// wykropkowana linia w kolorze magenty
HPEN hpenKarmazynoweKropki = CreatePen(PS_DOT, 0, RGB(255, 0, 255));
// normalna niebieska kreska
HPEN hpenAtrament = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
Jak widać, utworzenie własnego pióra jest bardzo proste.
Identycznie do CreatePen() działa funkcja CreatePenIndirect(). Zamiast trzech parametrów przyjmuje ona jedną strukturę LOGPEN, zawierają pola odpowiadające tym parametrom. Funkcja ta może być użyteczna, jeżeli np. chcemy zapisać nasze pióra w pliku na dysku.