Funkcja zwrotna (ang. callbackroutine) to taka funkcja, która jest wywoływana automatycznie po wystąpieniu zdarzenia powiązanego z widżetem (i nie tylko) dla którego została ona zdefiniowana. Przykładowo aplikacja z rysunku 6 zawiera cztery przyciski sterujące po naciśnięciu których przycisk z etykietą Button po prawej stronie będzie zmieniał kształt, czcionkę tekstu oraz kolor – to właśnie w funkcji zwrotnej są wywoływane procedury zmieniające dane parametry. Przykładowa struktura takiej funkcji wygląda jak poniżej – można zauważyć, że w zależności od zawartości powiadomienia typu WM_MESSAGE wykonywane są różne czynności.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void Callback(WM_MESSAGE * pMsg){ switch(pMsg->MsgId){ case WM_CREATE: . . . break; case WM_PAINT: . . . break; case WM_SIZE: . . . break; default: _Callback(pMsg); } |
Ogólnie do dyspozycji mamy 22 rodzaje widżetów, które w zupełności powinny wystarczyć do budowy standardowych aplikacji. Niemniej jednak nie jest to jakiekolwiek ograniczenie – biblioteka STemWin umożliwia tworzenie własnych widżetów i można wykorzystać do tego celu procedury rysujące prymitywy (podobnie jak w funkcjach zwrotnych). Wszystko to nie mogłoby poprawnie funkcjonować bez istnienia pewnego mechanizmu jakim jest menedżer okien, dzięki któremu można bez problemów wykonywać dowolne manipulacje nad obiektami widocznymi na wyświetlaczu (można również operować na tym co jest poza widocznym obszarem, gdyż biblioteka posiada funkcję wirtualnych wyświetlaczy) i który jest odpowiedzialny za prezentację tych obiektów w sposób naturalny – głównie chodzi o przesłanianie okien i widżetów, które są ułożone w przestrzeni trójwymiarowej, przy czym użytkownik widzi tylko dwa wymiary.
Funkcje graficzne
Prymitywy o jakich wspomniano powyżej są nieodłączną częścią biblioteki i można je stosować na równi z widżetami (tabelka 2). Oprócz standardowych procedur rysujących mamy również do wyboru takie, które korzystają z funkcji AntiAliasing (procedury z przedrostkiem GUI_AA_<Nazwa_Procedury>), która z kolei wygładza wszelkie nierówności krawędzi rysowanych elementów (rysunek 7). Istotnym jest także możliwość wyprowadzania tekstu i do tego celu w bibliotece zaimplementowano kilka procedur; jedne przyjmują wskaźnik do ciągu znaków, a inne – konkretne wartości zmiennych, które chcemy wyświetlić w różnych systemach (tabelka 3). Podobnie jak poprzednio biblioteka oferuje funkcję wygładzania czcionek.
Tab. 2. Wybrane procedury biblioteki STemWin powiązane z grafiką 2D
Procedura | Opis |
GUI_AA_DrawArc() | Rysuje wygładzony łuk o zadanym promieniu w zadanym zakresie kątów |
GUI_AA_DrawLine() | Rysuje wygładzoną linię o zadanych punktach początku i końca |
GUI_AA_DrawPolyOutline() | Rysuje wygładzony kontur wielokąta opisanego listą punktów |
GUI_AA_DrawRoundedRect() | Rysuje kontur prostokąta z wygładzonymi zaokrągleniami |
GUI_AA_FillCircle() | Rysuje wypełnione koło z wygładzonymi krawędziami |
GUI_AA_FillPolygon() | Rysuje wypełniony wielokąt z wygładzonymi krawędziami |
GUI_AA_FillRoundedRect() | Rysuje wypełniony prostokąt z wygładzonymi zaokrągleniami |
GUI_AA_SetFactor() | Ustawia wartość współczynnika funkcji AntiAliasing (od 1 do 6) |
GUI_ClearRect() | Wypełnia wskazany obszar kolorem tła |
GUI_CopyRect() | Kopiuje wskazany obszar ekranu |
GUI_DrawArc() | Rysuje łuk |
GUI_DrawBitmap() | Rysuje mapę bitową |
GUI_DrawCircle() | Rysuje kontur koła |
GUI_DrawEllipse() | Rysuje kontur elipsy |
GUI_DrawGraph() | Rysuje wykres |
GUI_DrawLine() | Rysuje linię wyznaczoną przez dwa punkty |
GUI_DrawPoint() | Rysuje punkt |
GUI_DrawPolygon() | Rysuje kontur wielokąta |
GUI_DrawPolyLine() | Rysuje polilinię |
GUI_DrawRect() | Rysuje kontur prostokąta |
GUI_EnableAlpha() | Włącza/wyłącza kanał alpha |
GUI_FillCircle() | Rysuje wypełnione koło |
GUI_FillEllipse() | Rysuje wypełnioną elipsę |
GUI_FillPolygon() | Rysuje wypełniony wielokąt |
GUI_FillRect() | Rysuje wypełniony prostokąt |
GUI_InvertRect() | Inwertuje kolory wskazanego obszaru ekranu |
GUI_RestoreContext() | Przywraca kontekst GUI |
GUI_RotatePolygon() | Obraca wielokąt o zadany kąt |
GUI_SaveContext() | Zapisuje kontekst GUI |
GUI_SetAlpha() | Ustawia wartość kanału alpha |
GUI_SetDrawMode() | Ustawia tryb rysowania (tryb normalny, tryb XOR) |
GUI_SetLineStyle() | Ustawia styl linii |
GUI_SetPenSize() | Ustawia rozmiar pióra rysującego w pikselach |
Kreator GUI oraz symulacja projektu
Pakiet z biblioteką STemWin zawiera narzędzia ułatwiające projektowanie interfejsu graficznego. Pierwsze z nich to GUIBuilder, które pozwala w prosty sposób tworzyć okienka i układać widżety z możliwością ustawiania wymiarów oraz definiowania ich zawartości – do pewnego stopnia (rysunek 9). Narzędzie to przechowuje ustawienia zaprojektowanych okienek w postaci pliku źródłowego z rozszerzeniem .c, a więc w pliku nadającym się do bezpośredniego podłączenia do projektu. Pozostałe narzędzia pozwalają na konwersje obrazków (narzędzie BmpCvt) oraz czcionek (narzędzie FontCvt) do plików z rozszerzeniem .c, w których dane są zapisane w tablicach.
Rys. 8. Projektowanie interfejsu graficznego z wykorzystaniem narzędzia GUIBuilder
W większości przypadków,gdy chcemy sprawdzić wygląd i działanie zaprojektowanej aplikacji graficznej, nie ma potrzeby za każdym razem programować układu. Wystarczy skompilować i uruchomić projekt w środowisku MS Visual C++, który jest dostępny w pakiecie z biblioteką emWin (STemWin niestety nie posiada takiego). Dzięki tej metodzie znacząco zaoszczędzimy czas oraz cykle zapisu pamięci Flash układu.