Grażyna Kamińska, Paweł Fritzkowski
Grafika komputerowa
Klasa WindowRange
Definiowanie układu współrzędnych użytkownika
z wykorzystaniem klasy
WindowRange
W systemie Windows rysowanie w oknach programów odbywa się za pośrednictwem kontekstu urządzenia (ang. device con
text). Kontekst urządzenia jest strukturą danych zawierającą informacje, które pozwalają systemowi przetłumaczyć żądania programi
sty na konkretne operacje na urządzeniu fizycznym. Kontekst ekranowy dotyczący obszaru roboczego okna pełni wiele funkcji, mię
dzy innymi:
- chroni przed modyfikacją ten obszar ekranu, który mu nie podlega,
- określa dwuwymiarowy układ współrzędnych wraz z jego orientacją,
- określa właściwości rysowania: kolor pióra, kolor pędzla, czcionkę, kolor tła, kolor tekstu, itp.
Układ współrzędnych określony przez kontekst urządzenia pokazano na rys. 1. Początek układu znajduje się w lewym górnym na
rożniku obszaru roboczego. Oś X skierowana jest w prawo, a oś Y – w dół. Omawiany układ współrzędnych ma ścisły związek z roz
dzielczością ekranu. W efekcie współrzędne (x, y) punktu wyraża się w pikselach, a zakresy osi X i Y są ograniczone rozmiarem
okna.
Rys. 1. Układ współrzędnych obszaru roboczego okna
Wszystkie standardowe funkcje graficzne wykonują operacje w tak określonym układzie współrzędnych.
Aby umożliwić zdefiniowanie układu współrzędnych użytkownika wzorowanego na układzie współrzędnych rzeczywistych,
stworzono klasę
WindowRange. Obiekt tej klasy przypisany do danego okna pozwala:
–
ustawić zakres osi prawoskrętnego układu współrzędnych (bez inwersji osi Y),
–
zapewnia zachowanie jednakowej długości jednostek na obu osiach.
Klasę
WindowRange należy traktować jako pomocniczą – jej obiekt przechowuje informacje o układzie użytkownika i umożli
wia jego zmianę. Informacje te są następnie wykorzystywane przez obiekt klasy
Graphics2D, pozwalającej wykonywać operacje
graficzne z wykorzystaniem współrzędnych rzeczywistych.
Obiekt zakresu okna
najlepiej utworzyć w momencie, gdy okno jest tworzone (komunikat WM_CREATE). Konstruktor wymaga po
dania uchwytu okna:
WindowRange wr= WindowRange(hwnd);
Następnie możemy ustawić przedziały zmiennych rzeczywistych x i y, wywołując metodę
SetRange, przy czym zmodyfikuje ona
podane przedziały, by zapewnić zachowanie proporcji elementów obrazu:
wr.SetRange(-50, -100, 200, 100);
W kodzie procedury okna należy również zadbać o aktualizację układu współrzędnych, która staje się konieczna w przypadku zmiany
wymiarów okna (komunikat
WM_SIZE). Uaktualnienie układu użytkownika nastąpi wskutek wywołania metody Update:
wr.Update(hwnd);
Poniżej szczegółowo opisano funkcje składowe klasy
WindowRange.
void SetProportional(bool prop)
prop – parametr określający, czy obraz rysowany jest z zachowaniem proporcji.
Funkcja włącza lub wyłącza tryb zachowania proporcji rysowanych obiektów. Aby zapewnić jednakowe jednostki na obu osiach, pa
rametr
prop powinien mieć wartość true.
void SetRange(float x1, float y1, float x2, float y2)
x1, y1 – współrzędne lewego dolnego wierzchołka prostokąta ograniczającego.
x2, y2 – współrzędne prawego górnego wierzchołka prostokąta ograniczającego.
1
Grażyna Kamińska, Paweł Fritzkowski
Grafika komputerowa
Klasa WindowRange
Metoda ustawia zakresy osi układu użytkownika w oparciu o prostokątny obszar rysowania zdefiniowany przez współrzędne dwóch
przeciwległych wierzchołków.
Jeżeli włączony jest tryb zachowania proporcji, zapewnienie jednakowych jednostek na obu osiach może wymagać modyfikacji po
danych wartości. W zależności od proporcji obszaru roboczego okna, zakres jednej z osi może zostać zwiększony przez dodanie od
powiednich marginesów.
Niech k oznacza stosunek szerokości w do wysokości h obszaru roboczego wyrażonych w pikselach:
k = w
h
.
Z kolei niech
k '
będzie współczynnikiem proporcji obszaru zdefiniowanego w jednostkach użytkownika
k '= w '
h'
,
gdzie
w '= x
2
−
x
1
oraz
h' = y
2
−
y
1
.
Możliwe są trzy przypadki:
a)
k >k '
– stosuje się obustronny margines poziomy m
x
(rys. 2a); podany zakres dla osi Y nie ulega zmianie, zatem
x
min
=
x
1
−
m
x
, x
max
=
x
2
+
m
x
,
y
min
=
y
1
,
y
max
=
y
2
,
b)
k <k '
– stosuje się obustronny margines pionowy m
y
(rys. 2b); podany zakres dla osi X nie ulega zmianie, zatem
x
min
=
x
1
, x
max
=
x
2
,
y
min
=
y
1
−
m
y
,
y
max
=
y
2
+
m
y
,
c)
k =k '
– podane zakresy dla obu osi nie ulegają zmianie, czyli
x
min
=
x
1
, x
max
=
x
2
,
y
min
=
y
1
,
y
max
=
y
2
.
Jak wynika z powyższych informacji, użytkownik ma pewność, że zdefiniowany przez niego prostokątny obszar rysowania zostanie
odwzorowany w całości na obszar widoku.
Rys. 2a)
Rys. 2b)
Rys. 2. Proporcje obszaru roboczego, a obszar zdefiniowany przez użytkownika
2
Grażyna Kamińska, Paweł Fritzkowski
Grafika komputerowa
Klasa WindowRange
void Update(HWND hwnd)
hwnd – uchwyt okna.
Funkcja aktualizuje zakres współrzędnych użytkownika, korzystając z wymiarów okna, którego uchwyt przekazujemy. Wywołanie
metody jest niezbędne przy zmianie proporcji okna.
bool GetProportional()
Funkcja określa, czy włączony jest tryb zachowania proporcji – zwraca wartość
true, jeśli tryb ten jest włączony.
float GetX1()
float GetY1()
float GetX2()
float GetY2()
Funkcje zwracają ustalone granice obszaru rysowania wyrażone w jednostkach użytkownika – minimalne i maksymalne wartości
współrzędnych w obszarze roboczym.
float GetWidth()
float GetHeight()
Metody zwracają odpowiednio szerokość i wysokość obszaru rysowania w jednostkach użytkownika.
void GetWindowSize(int * w, int * h)
void GetWindowSize(float * w, float * h)
w – wskaźnik do zmiennej przechowującej szerokość okna.
h – wskaźnik do zmiennej przechowującej wysokość okna.
Funkcje pozwalają pobrać wymiary okna skojarzonego z obiektem klasy
WindowRange. Wymiary wyrażone są w pikselach, przy
czym druga z funkcji dokonuje ich konwersji na liczby rzeczywiste typu
float.
float GetAspectRatio()
Metoda oblicza współczynnik proporcji obszaru roboczego – stosunek jego szerokości do wysokości.
void ScaleRange(float s)
s – współczynnik skali.
Metoda dokonuje przeskalowania granic obszaru w jednostkach użytkownika. Gdy s < 1, następuje s-krotne zmniejszenie przedzia
łów zmiennych x i y, czyli powiększenie elementów rysunku. Natomiast współczynnik s > 1 powoduje s-krotne zwiększenie zakresu
współrzędnych, tzn. pomniejszenie tworzonego obrazu.
3