2011-04-28 71 views
3

我有一個MyFrame,它來自wxFrame。一個wxTextCtrl被添加到這個框架。我可以在框架中處理這個文本控件的EVT_KEY_DOWN嗎?類似的,wxFrame處理來自wxTextCtrl的事件 - C++/wxWidgets

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

上述代碼似乎不起作用。文檔說這樣的事件只能由發生事件的對象來處理。那麼我應該繼承wxTextCtrl來處理這個問題,並以某種方式將信息發送到幀?

這樣做的最好方法是什麼?

回答

4

從子控件的wxCommandEventwxNotifyEvent類型的事件被設置爲傳播向上父框架自動。然而,wxKeyEventwxEvent派生,因此它不會傳播到父框架。那麼,您可以使用動態事件處理程序將一些事件路由到任何wxEvtHandler派生對象。你可以使用wxEvtHandler::Connect。該方法描述爲here。你也可以看看this sample code

下的wxWidgets 2.9和SVN你應該使用wxEvtHandler::Bind<>:描述here

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

wxEvtHandler::Bind<>方法。

3

是的,子類wxtextCtrl來處理父框架中的按鍵。

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

當然

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

在該方法中,該事件傳遞到您的MyFrame

void cSpecialTextCtrl::OnKeyDown(wxKeyEvent& ev) 
{ 
    ((MyFrame*)GetParent())->OnKeyDown(ev); 
} 
相關問題