Graficzny interfejs użytkownika GUI: komponent typu Listbox (4)

W artykule przedstawiamy sposób realizacji komponentu graficznego typu Listbox (nie wchodzącego w skład standardowej biblioteki graficznej). Funkcje jakie zostały zaimplementowane odpowiadają za: tworzenie i wyświetlanie komponentu, dodawanie i usuwanie wpisów listy, a także wywołanie funkcji typu event-handler. Wywołanie tej ostatniej w przedstawionej aplikacji powoduje wyświetlenie indeksu wybranego wpisu z listy.

Aplikację przetestowano na zestawie DevKit407 składającym się z płytki STM32F4DISCOVERY oraz płytek rozszerzeniowych firmy Embest: DM-STF4BB (płytka bazowa) i DM-LCD35RT (płytka z wyświetlaczem) – fotografia 1.

 

 

Fot. 1. Wygląd zestawu testowego

 

Fot. 2. Widok okna przykładowej aplikacja z komponentem typu Listbox

 

Definicja komponentu

Pierwszą czynnością jaką należy wykonać przy dodawaniu nowego komponentu jest zdefiniowanie w pliku graphicObjectTypes.h jego cech w postaci struktury zawierającej odpowiednie pola. Do opisu komponentu typu Listbox wykorzystywane są dwie struktury:

Należy także poinformować o nowym rodzaju komponentu poprzez poszerzenie definicji typu wyliczeniowego GL_ObjType o linijkę GL_LISTBOX:

Tworzenie i wyświetlanie komponentu

W pliku graphicObject.c umieszczane są funkcje odpowiedzialne za tworzenie, modyfikację i wyświetlanie komponentów. Komponent typu Listbox jest tworzony przez funkcję NewListbox() przyjmującą jako argumenty: unikalny numer ID, szerokość boxu (w osi X), wysokość boxu (w osi  Y), flagę wielokrotnego wyboru, a także nazwę funkcji typu event-handler jaka będzie wywoływana przy wybraniu któregokolwiek wpisu. Po zarezerwowaniu miejsca w pamięci RAM i po poprawnym zainicjalizowaniu wszystkich wymaganych pól struktury jest zwracany wskaźnik na obiekt typu GL_PageControls_TypeDef:

Komponent jest wyprowadzany na ekran za pomocą funkcji SetListboxVisible():

Dodawanie i usuwanie wpisów

Do dodawania wpisów do listy służy funkcja AddListboxItem(), która przyjmuje wskaźnik na obiekt typu GL_PageControls_TypeDef (który to zawiera wskaźnik na właściwy obiekt typu Listbox) oraz wskaźnik na ciąg znaków (tekst jaki będzie wyświetlany na określonej pozycji w liście):

Usuwaniem wszystkich wpisów listy zajmuje się funkcja RemoveListboxAllItems():

Natomiast za usuwanie tylko wybranych (te które są wyróżnione – biały tekst na niebieskim tle) wpisów listy odpowiada funkcja RemoveListboxSelectedItems():

Integracja komponentu

Do zakończenia rozbudowy biblioteki GUI zostaje jeszcze dodanie kodu obsługi komponentu w już istniejących funkcjach tejże biblioteki (plik graphicObject.c). Pierwsza z tych funkcji dodaje obiekt do strony:

Kolejna funkcja GetObjSize() pobiera wymiary obiektu:

Dodatkowo dodano funkcję pobierającą wskaźnik na obiekt o zadanym numerze ID:

Również koniecznym jest uzupełnienie funkcji CallPreEvents() oraz CallEvent() wywoływanych z funkcji ProcessInputData() w przypadku, gdy panel został dotknięty w miejscu gdzie „znajduje się” dany komponent. Pierwsza z nich jest odpowiedzialna za aktualizację stanu i przerysowanie komponentu:

Wywoływana funkcja UpdateListboxState() przyjmuje jako argumenty: wskaźnik na obiekt typu GL_PageControls_TypeDef oraz wartości współrzędnych punktu w jakim wykryto dotknięcie:

Funkcja CallEvent() uzupełniona o wywołanie funkcji event-handler dla komponentu typu Listbox:

Budowa interfejsu

Plik uiframework.c, w którym zawarte są funkcje odpowiedzialne za utworzenie i rozkład komponentów na ekranie wygląda następująco:

Definicje funkcji typu event-handler dla zastosowanych komponentów znajdują się w pliku uiappuser.c:

Główna pętla programu

Struktura funkcji main() pozostaje bez zmian w stosunku do opisanej w poprzedniej części artykułu:

Jan Szemiet

Do pobrania

Autor: