background image

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 (xy) punktu wyraża się w pikselach, a zakresy osi  i  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

background image

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:

 

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 '

 – 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 '

 – 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 '

 – 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

background image

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