background image

Więcej o zdarzeniach

•Jak zmieniać metody obsługi w 

czasie działania programu

•Jak rozpoznać w metodzie 

źródło i parametry zdarzenia

background image

Wybrane rodzaje zdarzeń

• wxCommand – przenosi zdarzenia od wielu 

podstawowych kontrolek

• wxMouseEvent – reprezentuje zdarzenia 

od myszy

• wxKeyEvents – klasa zdarzeń wywołanych 

za pomocą klawiatury

background image

• 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

background image

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()

background image

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

background image

bool Disconnect(int id, wxEventType 
event_type, wxObjectFunction function, 
wxObject* userData, wxEventHandler 
eventSink)

Metoda Disconnect posiada taką samą listę parametrów  jak metoda Connect

background image

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ć

background image

• 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”));
}

background image

• 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)
);
}

background image

•  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

background image

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

background image

• Rozpoznawanie obiektu może być 

konieczne, jeśli chcemy zaprogramować 
jedną metodę do obsługi zdarzeń z kilku 
kontrolek

background image

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);

background image

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

background image

• 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


Document Outline