Biblioteka SeggerSTemWin w praktyce (3): suwaki

W trzecim (linki do: pierwszego i drugiego) artykule poświeconym bibliotece Segger STemWin opisujemy podstawy związane z obsługa “suwaków”. Zawarto w nim krótki opis wybranych funkcji API oraz przykładowe aplikacje wykorzystujące przedstawione dotąd wiadomości.

Fot. 1. Zestaw STM32F429I-Discovery i uruchomiona aplikacja demonstracyjna

Biblioteka STemWin jest dość dobrze rozbudowana pod względem liczby komponentów, funkcji API oraz innych ciekawych możliwości. Stąd też nie sposób jej opisać na kilku stronach bez podawania przykładów mających na celu zapoznanie czytelnika ze szczegółami i pozwolenia mu uniknąć ewentualnych problemów z jej zastosowaniem.

 

Suwaki – widżet SLIDER

Suwaki są szeroko stosowane do ustawiania wartości różnych parametrów, a przykładową strukturę takiego widżetu przedstawiono na rysunku 2. Element ruchomy (suwak) przyczepiony do paska może zajmować dowolnepołożenie ze zdefiniowanej ich liczby (domyślnie jest ich 101), przy czym liczba tawraz z szerokością widżetu wpływa na skok jednostkowy suwaka. Nad tym ostatnim znajdują się podziałki, ilość których można ustawić w dowolny sposób niezależnie od tego jaki został wybrany zakres wartości suwaka. Jeśli pojawi się potrzeba zmiany koloru któregoś z elementów to wystarczy wywołać odpowiednią procedurę z podaniem koloru w postaci 24-bitowej liczby lub stałej, np. GUI_RED (stałe te są zdefiniowane w pliku GUI.h).Oprócz ustawiania domyślnych wartości parametrów w trakcie pracy programu istnieje również możliwość zdefiniowania ich na etapie kompilacji projektu, co przedstawia tabelka 1.

Procedury powiązane z omawianym widżetem przedstawiono w tabelce 2 (patrz również plik SLIDER.h), aznaczenie i zastosowanie większości jest intuicyjnie proste, stąd też nie wymaga większego komentarza – przykłady pokazano na listingu w dalszej części artykułu. Należy tylko wspomnieć, że duża ich część jako pierwszy parametr przyjmuje uchwyt do istniejącego komponentu z suwakiem – zmienna typu SLIDER_Handle.

Rys. 2. Elementytworzące widżet SLIDER

Tab. 1. Wartości domyślne definiowane na etapie kompilacji

Typ Makro Wartość domyślna Opis
Liczba SLIDER_BKCOLOR0_DEFAULT 0xC0C0C0 Kolor tła widżetu.
Liczba SLIDER_COLOR0_DEFAULT 0xC0C0C0 Kolor suwaka.
Liczba SLIDER_FOCUSCOLOR_DEFAULT GUI_BLACK Kolor ramki zaznaczenia.

 

Tab. 2. Procedury powiązane z widżetem SLIDER

Procedura Opis
SLIDER_Create() Tworzy widżet SLIDER (wersja przestarzała).
SLIDER_CreateEx() Tworzy widżet SLIDER.
SLIDER_CreateIndirect() Tworzy widżet SLIDER z poziomu tablicy zasobów.
SLIDER_CreateUser() Tworzy widżet SLIDER z dodatkową rezerwacją miejsca w pamięci dla danych użytkownika.
SLIDER_Dec() Zmniejsza o 1 bieżącą wartość suwaka (pozycję).
SLIDER_GetUserData() Odczytuje dane użytkownika z widżetu SLIDER.
SLIDER_GetValue() Zwraca bieżącą wartość suwaka (pozycję).
SLIDER_Inc() Zwiększa o 1 bieżącą wartość suwaka (pozycję).
SLIDER_SetBarColor() Ustawia kolor suwaka.
SLIDER_SetBkColor() Ustawia kolor tła widżetu.
SLIDER_SetDefaultBkColor() Ustawia domyślny kolor tła widżetu.
SLIDER_SetDefaultBarColor() Ustawia domyślny kolor suwaka.
SLIDER_SetDefaultFocusColor() Ustawia domyślny kolor ramki zaznaczenia.
SLIDER_SetDefaultTickColor() Ustawia domyślny kolor podziałek.
SLIDER_SetFocusColor() Ustawia kolor ramki zaznaczenia.
SLIDER_SetNumTicks() Ustawia liczbę podziałek na pasku suwaka.
SLIDER_SetRange() Ustawia zakres wartości suwaka.
SLIDER_SetTickColor() Ustawia kolor podziałek.
SLIDER_SetUserData() Zapisuje dane użytkownika w widżecie SLIDER.
SLIDER_SetValue() Ustawia bieżącą wartość suwaka (pozycję).
SLIDER_SetWidth() Ustawia szerokość suwaka.

Wystarczy tutaj tylko szczegółowo omówić procedurę tworzenia widżetu. Do dyspozycji mamy cztery jej wersje:

  • wersja zwykła przestarzała – różniąca się od aktualnej tylko kolejnością parametrów,
  • wersja zwykła aktualna,
  • wersja przeznaczona dla okienek dialogowych – jej wpis występuje w tablicy zasobów,
  • wersja umożliwiająca zarezerwowanie dodatkowej przestrzeni w pamięci dla dowolnych danych użytkownika.

Na razie warto skupić się tylko na zwykłej i aktualnej wersji tej procedury, której lista przyjmowanych parametrów jest następująca:

  • położenie widżetu w osi X okna rodzica,
  • położenie widżetu w osi Y okna rodzica,
  • szerokość widżetu w osi X,
  • wysokość widżetu w osi Y,
  • uchwyt do okna rodzica (0 – dla pulpitu),
  • flagi kreacji (patrz tabela 2),
  • flagi dodatkowe (patrz tabela 3),
  • numer identyfikacyjny widżetu.

 

Tab. 3. Flagi dodatkowe dostępne dla widżetu SLIDER

Flaga Opis
SLIDER_CF_HORIZONTAL Ruch suwaka odbywa się w osi X (konfiguracja domyślna).
SLIDER_CF_VERTICAL Ruch suwaka odbywa się w osi Y.

Poniżej pokazano kod aplikacji demonstrującej podstawowe możliwości suwaków (rysunek 3) – wystarczy podmienić zawartość funkcji Main_Task() przedstawionej w poprzednim artykule [2].

Jak widać zbudowanie prostej aplikacji z suwakami nie jest trudne. Jednak operacjewyświetlania aktualnych wartości suwaków oraz zmiany koloru tła trzeciego suwaka można byłoby zrealizować w inny, efektywny sposób z wykorzystaniem funkcji zwrotnych. Otóż z danym widżetem związane są 3 zdarzenia, które powodują wysyłanie powiadomień (wiadomości)będących częścią innegopowiadomieniaWM_NOTIFY_PARENT adresatem którego jest okno rodzica (tabelka 4). Gdybyśmy teraz zdefiniowali funkcję zwrotną dla stworzonego widżetu FRAMEWIN to spotkalibyśmy się z problemem nie odbierania wiadomości WM_NOTIFY_PARENT oraz tych ze wskazanej tabelki. Wyjściem z zaistniałej sytuacji jest wykorzystanie okna klienta, w którym to należy umieścić suwaki i dla którego zdefiniować funkcję zwrotną. Zaleca się również w pozostałych przypadkach zawsze dodawać inne widżety do okna klienta widżetu FRAMEWIN, a nie bezpośrednio do niego, gdyż wiążą się z tym jeszcze inne problemy, np. procedura WM_GetFirstChild(hFramewin) może zwrócić inny uchwyt zamiast oczekiwanego mimo, że pierwszy potomek był przywiązany do okna wskazywanego przez hFramewin.

Tab. 4. Powiadomienia związane ze zdarzeniami od suwaków

Powiadomienie Opis
WM_NOTIFICATION_CLICKED Widżet został wciśnięty.
WM_NOTIFICATION_RELEASED Widżet został odpuszczony.
WM_NOTIFICATION_VALUE_CHANGED Bieżąca wartość suwaka została zmieniona.

Rys. 3. Przykładowa aplikacja z suwakami w stylu klasycznym i stylu Flex

W funkcji zwrotnej wykorzystano opisane wcześniej procedury powiązane z WM, dzięki którym mamy możliwość w miarę swobodnego operowania na widżetach znając ich numery ID, ale niestety kosztem bardziej skomplikowanego kodu:

Na koniec należy wspomnieć, że w przypadku ustawienia innego stylu niż klasyczny musimy liczyć się z tym, że modyfikacja kolorów może odbywać się w inny sposób. Dodatkowych informacji na ten temat należy szukać w rozdziale „Skinning”.

Jan Szemiet

 

Literatura:

[1] UM03001: emWin, Graphic Library with Graphical User Interface, User & Reference Guide

[2] LINK – Biblioteka STemWin: Pierwsza prosta aplikacja okienkowa

Do pobrania

Autor: admin

Admin