GUI - Wywoływanie zdarzeń po kliknięciu przycisku

0

Witam. Piszę samodzielnie gui i zastanawia mnie jak napisać wywoływanie odpowiedniej akcji po np naciśnięciu danego przycisku. Stworzyłem klase GUI_manager, która zajmuje się przechowywaniem, rysowaniem itp elementów interfejsu oraz klasę wirtualną GUI_object zawierającą podstawowe informacje na temat elementów interfejsu. Po klasie GUI_object dziedziczą inne klasy, np GUI_button. W klasie GUI_object, znajduje się metoda wirtualna "onClick()", która jest zastępowana przez metodę w GUI_button. W tej metodzie ma się znajdować wywołanie odpowiedniego zdarzenia. Problem jest taki, że zarówno np przycisk "Play" oraz "Exit" będą obiektami klasy GUI_button, a wiec po naciśnięciu na nie będzie wywoływana ta sama metoda, mimo iż efekty mają być różne. Jedyne co mi przychodzi do głowy to: Dodanie do klasy zmiennej, w której będzie przechowywany rodzaj zdarzenia, a podczas wywoływania metody "onClick()" switch albo if będzie wywoła odpowiednią funkcje albo metodę klasy GUI_button/GUI_manager. Czy ten sposób jest dobry? Jest jakieś inne rozwiązanie tego problemu?

0
GrhuGhu napisał(a):

Jest jakieś inne rozwiązanie tego problemu?

Dziedziczenie.

Wydaje mi się, że najrozsądniej jest zrobić klasę GUI_button_exit i klasę GUI_button_play, które będą miały swoje implementacje metody onClick() i dopiero na ich podstawie dwa obiekty przycisków.

Edit:
Możesz też zamiast dziedziczenia użyć wskaźnika na funkcję. Wtedy w klasie GUI_button w metodzie onClick() wywołujesz funkcję podaną przez użytkownika twojej biblioteki.

0

Sposób z dziedziczeniem rozważałem, dało by to podobny efekt jak jest w c++ builderze od borland, jednak tworzenie osobnych klas dla każdego elementu interfejsu istniejącego w programie wydaje mi się trochę niepotrzebnym zaśmiecaniem kodu. A co do wskaźnika na funkcje, to w sumie wychodziło by na to samo, co dodanie zmiennej definiującej akcje jaka ma zostać wywołana po onClick(), który następnie za pomocą if/switch wywoływał by odpowiednią funkcje/metode.

1
GrhuGhu napisał(a):

Sposób z dziedziczeniem rozważałem, dało by to podobny efekt jak jest w c++ builderze od borland, jednak tworzenie osobnych klas dla każdego elementu interfejsu istniejącego w programie wydaje mi się trochę niepotrzebnym zaśmiecaniem kodu.

Nie do końca o coś takiego mi chodziło. Możesz podejrzeć jak jest zrobiony kod biblioteki wxWidgets, a konkretnie fragment odpowiedzialny za przyciski wxButton. Masz tutaj jedną klasę wxButton odpowiedzialną za wyświetlanie typowego przycisku oraz klasę wxBitmapButton do wyświetlania przycisku z obrazkiem.

Same zdarzenia generuje klasa wxEvtHandler do której rejestrujesz funkcje odpowiedzialne za wykonanie zdarzenia, metodą Bind. Przypuszczam (bo nigdy tego nie sprawdziłem), że właśnie ta funkcja dodaje gdzieś wewnątrz klasy wskaźnik na funkcję, która ma się wykonać po otrzymaniu konkretnego zdarzenia, np. onClick().

Może trochę to zagmatwałem, ale w linkach które Ci podałem znajdują się dość czytelne rysunki, które pozwolą Ci się zorientować co mam na myśli jeśli chodzi o dziedziczenie.

0

Sugerowałbym coś w stylu funktora -> obiektu który ma jakąś metodę execute i który realizuje akcje. Tworząc guzik musisz mu podać jako jeden z parametrów taki funktor. Jest to o tyle lepsze od wskaźnika na funkcje że wskaźnik limituje ci sygnatury funkcji. Funktor może przyjąć w konstruktorze parametry a potem w trakcie wykonywania akcji z nich korzystać.

0

@Ankari rysunki zapewne są czytelne, jednak niewiele zrozumiałem z nich i dokumentacji, a próby czytania kodu (Zwłaszcza po angielsku...) skończą się u mnie pewnie jak próba nauczenia niemowy języka chińskiego. Zbyt dużo poleceń/elementów kodu, których ze względu na to, że jestem programistą samoukiem nie zrozumiem, lub jak w przypadku SFML jakieś dziwnie wyglądające puste ciała klas lub czegoś podobnego z zwyczajnym komentarzem opisującym co dany element robi, jednak bez możliwości przyglądnięcia się zasadzie działania. Za dużo inżynierii wstecznej i pytań typu: Co autor miał na myśli? Gdzie reszta kodu? Kim jesteśmy i dokąd zmierzamy? Aczkolwiek będę miał Twoją pomoc na uwadze i myślę, że za jakiś czas na pewno spróbuje przeanalizować bibliotekę wxWidgets.

Osobiście skorzystam z funktora, gdyż wygląda na naprawdę łatwy i prosty sposób, a otrzymam nim pożądane efekty nawet teraz, bez zbytniego wkładu czasu i energii (Jak robić żeby zrobić, ale się nie narobić).
Dziękuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1