2011-04-28 8 views
3

J'ai un MyFrame qui dérive de wxFrame. Un wxTextCtrl est ajouté à cette image. Puis-je gérer EVT_KEY_DOWN de ce contrôle de texte dans le cadre? Quelque chose comme,Traitement des événements de wxTextCtrl sur wxFrame - C++/wxWidgets

BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) 
    EVT_KEY_DOWN(MyFrame::OnKeyDown) 
END_EVENT_TABLE() 

Le code ci-dessus ne semble pas fonctionner. La documentation indique que les événements de ce type ne peuvent être gérés que par l'objet sur lequel l'événement est généré. Donc devrais-je sous-classer wxTextCtrl pour gérer cela et en quelque sorte envoyer l'information à l'image?

Quelle est la meilleure façon de procéder?

Répondre

4

Les événements de type wxCommandEvent et wxNotifyEvent d'un contrôle des enfants sont mis à se propager vers le haut pour le cadre parent automatiquement. Cependant, le wxKeyEvent est dérivé du wxEvent et ne se propage donc pas à la trame parente. Eh bien, vous pouvez utiliser des gestionnaires d'événements dynamiques pour acheminer certains des événements vers l'un des objets dérivés wxEvtHandler. Sous wxWidgets 2.8, vous devez utiliser wxEvtHandler::Connect sous 0x34. Cette méthode est décrite here. Vous pouvez également regarder this sample code.

Sous wxWidgets 2.9 et SVN, vous devez utiliser wxEvtHandler::Bind<>:

MyFrame::MyFrame(...) 
{ 
    m_textcontrol->Bind(wxEVT_KEY_DOWN, &MyFrame::OnTextControlKeyDown, this); 
} 

La méthode est décrite wxEvtHandler::Bind<>here.

3

Oui, sous-classe wxtextCtrl pour gérer les touches enfoncées dans le cadre parent.

class cSpecialTextCtrl : public wxTextCtrl 
{ 
public: 
    cSpecialTextCtrl(...) : wxTextCtrl(...) {} 
    void OnKeyDown(wxKeyEvent& ev); 
private: 
    DECLARE_EVENT_TABLE() 
}; 

et bien sûr

BEGIN_EVENT_TABLE(cSpecialTextCtrl , wxTextCtrl) 
    EVT_KEY_DOWN(cSpecialTextCtrl ::OnKeyDown) 
END_EVENT_TABLE() 

Dans la méthode, passer l'événement à votre MyFrame

void cSpecialTextCtrl::OnKeyDown(wxKeyEvent& ev) 
{ 
    ((MyFrame*)GetParent())->OnKeyDown(ev); 
} 
Questions connexes