Więcej o zdarzeniach
•Jak zmieniać metody obsługi w
czasie działania programu
•Jak rozpoznać w metodzie
źródło i parametry zdarzenia
Wybrane rodzaje zdarzeń
• wxCommand – przenosi zdarzenia od wielu
podstawowych kontrolek
• wxMouseEvent – reprezentuje zdarzenia
od myszy
• wxKeyEvents – klasa zdarzeń wywołanych
za pomocą klawiatury
• Każda z tych klas posiada zbiór metod
charakterystyczny dla danego rodzaju
zdarzeń.
– np. wxEventMouse posiada metody do
odczytania aktualnych współrzędnych
wskaźnika myszy
• Zdarzenie przekazywane jest do metody
obsługi za pomocą obiektu odpowiedniej
klasy
• Metod do zarządzania obsługą zdarzeń
dostarcza klasa wxEvtHandler
Dynamiczna obsługa zdarzeń
• By zmienić metodę obsługi zdarzenia np.
w zależności od stanu jakiegoś parametru
możemy posłużyć się metodą Connect() z
klasy wxEventHandler po tej klasie
dziedziczy klasa wxFrame zatem jest ona
dostępna dla okna aplikacji
• Metoda Connect() posiada kilka możliwych
list parametrów //mechanizm
przeciążania//.
• W przypadku dynamicznej obsługi zdarzeń
nie można polegać na automatycznym
tworzeniu kodu!
• Odłączamy metody za pomocą
Disconnect()
Najprostsza postać Connect():
• void Connet(int id, wxEventType event_type,
wxObjectFunction function, wxObject*
userData, wxEventHandler eventSink)
• Parametry:
id – identyfikator kontrolki jest to taki sam, jakiego
użylibyśmy w tabeli zdarzeń
event_type rodzaj zdarzenia na jakie ma reagować
metoda obsługi
function parametr przekazuje nazwę metody, którą
chcemy obsługiwać zdarzenie
userData domyślnie ma wartość NULL zawiera
dodatkowe dane powiązane z metodą
eventSink domyślnie wskaźnik this, przydaje się,
gdy kontrolka jest w innej klasie niż metoda obsługi
zdarzenia
bool Disconnect(int id, wxEventType
event_type, wxObjectFunction function,
wxObject* userData, wxEventHandler
eventSink)
Metoda Disconnect posiada taką samą listę parametrów jak metoda Connect
Dynamiczne dołączanie zdarzeń
• Otwórz istniejący projekt lub wstaw nowy
• Dodaj Panel, dwa przycisk Button, przycisk
opcji CheckBox i pole tekstowe Memo
• W klasie okna należy zadeklarować
metody obsługi naciśnięcia przycisków:
– Przejdź do pliku Projetk1Frm.h
– Znajdź deklaracje prywatnych metod i dopisz w
tej sekcji metody
• CheckBox_tak(wxCommandEvent& event) i
• CheckBox_nie(wxCommandEvent& event)
– Nazwy metod mogą być oczywiście dowolne
byle je później konsekwentnie stosować
• Przejdź do pliku Projekt1Frm.cpp
• Na końcu dopisz definicje metod przed
chwilą zadeklarowanych – będą one
wyświetlały odpowiednie komunikaty w
oknie Memo:
– void
Projekt1Frm::CheckBox_tak(wxCommandEvent&
event){
WxMemo1->AppendText(wxT(” Pole opcji
zaznaczone\n”));
}
– void Projekt1Frm::
CheckBox_nie(wxCommandEvent& event)
{
WxMemo1->AppendText(wxT(” Pole opcji
czyste\n”));
}
• Podłączanie i odłączanie naciśnięcia przycisku
Button będzie realizowane w momencie zmiany
stanu przycisku CheckBox.
• Metoda obsługi CheckBox będzie podłączona
statycznie:
– Kliknij dwukrotnie kontrolkę CHeckBox w oknie
budowanej aplikacji i i w utworzonej metodzie wpisz
kod:
if (wxCheckBox1->GetValue()==true) {
Disconnect(ID_WXBUTTON1);
Connect(ID_WXBUTTON1,
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(Projekt1Frm::CheckBox_tak)
);
if(wxCheckBox1->GetValue==false){
Disconnect(ID_WXBUTTON1);
Connect(ID_WXBUTTON1,
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(Projekt1Frm::CheckBox_nie)
);
}
• Przy uruchomieniu programu przycisk
opcji jest niezaznaczony, a wiec klikniecie
przycisku Button powinno wyzwalać
metodę CheckBox_nie. Zatem do
CreateGUIControls() wpisz kod załączający
tę metodę:
Connect(ID_WXBUTTON1,
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommand_eventHandler(Projekt1Frm::CheckBox_ni
e));
• Skompiluj i uruchom program
Rozpoznawanie obiektu generującego
zdarzenie w metodzie obsługi
• Metoda obsługi zdarzeń posiada jeden
parametr typu wxCommandEvent&, w jego
polach przekazywane są informacje o
obiekcie wywołującym zdarzenia. Ich
odczyt następuje za pomocą odpowiednich
metod i pozwala zidentyfikować obiekt
wywołujący zdarzenie.
• Do identyfikacji obiektu służy metoda
GetID(), pochodząca z klasy wxEvent.
Zwraca ona identyfi-kator obiektu -ten
sam, z jakiego korzystaliśmy okreś-lając
obiekt w tabeli zdarzeń czy metodzie
connect
• Rozpoznawanie obiektu może być
konieczne, jeśli chcemy zaprogramować
jedną metodę do obsługi zdarzeń z kilku
kontrolek
Obsługa zdarzeń z kilku kontrolek za
pomocą jednej metody
• Umieść na Panelu dwa przyciski Button i pole
tekstowe Memo
• Naciśnij dwukrotnie WxButton1 (widok
projektu) i dopisz poniższy kod w utworzonej
metodzie.
– if(event.GetID()==ID_WXBUTTON1) WxMemo1->
AppendText(wxT(”Naciśnięty przycisk 1\n”));
if(event.GetID()==ID_WXBUTTON2) WxMemo1->
AppendText(wxT(”Naciśnięty przycisk 2\n”));
Podłącz tęmetodę do drugiego przycisku w
tabeli zdarzeń //
lub Zdarzenia/OnClick-rozwiń
listę i wybierz
EVT_BUTTON(WX_BUTTON2, Projekt1Frm::
WxButton-1Click);
Obsługa zdarzeń z zakresu kontrolek
• Obsługa każdej kontrolki wymaga
osobnego wpisu w tabeli zdarzeń.
• jeżeli metoda ma obsługiwać wiele
kontrolek danego typu, zapis można
skrócić przez zastosowanie makra
EVT_COMMAND_RANGE(id1, id2,event,
func)
• Jak to się robi?
• Deklarujemy metodę w pliku nagłówkowym
• Definiujemy w pliku źródłowym np..:
if(event.GetId()==ID_CHECKBOX1) WxMemo1-
> AppendText(wxT”Opcja 1 – zmiana stanu\n”);
…. I podobnie dla pozostałych obiektów
posiadających kolejne numery identyfikacyjne
• Teraz należy podłączyć metodę jako
obsługi zdarzeń danego typu, w naszym
przypadku
wxEVT_COMMAND_CHECKBOX_CLICKED
stosując makro EVT_COMMAND_RANGE
• EVT_COMMAND_RANGE (1001, 1008,
wxEVT_COMMAND_CHECKBOX_CLICKED ,
Plik.h::nazwa_metody)
• Kompilujemy i uruchamiamy