Обработка событий из wxTextCtrl на wxFrame - C++/wxWidgets
У меня есть MyFrame
который вытекает из wxFrame
, wxTextCtrl
добавлен в этот кадр. Могу ли я справиться EVT_KEY_DOWN
этого текстового элемента управления во фрейме? Что-то вроде,
BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
EVT_KEY_DOWN(MyFrame::OnKeyDown)
END_EVENT_TABLE()
Код выше, кажется, не работает. Документация говорит, что подобные события могут быть обработаны только объектом, из которого происходит событие. Так что я должен подкласс wxTextCtrl
справиться с этим и как-то отправить информацию в кадр?
Каков наилучший способ сделать это?
2 ответа
wxCommandEvent
а также wxNotifyEvent
События типа от дочерних элементов управления настроены на автоматическое распространение вверх в родительский фрейм. Тем не менее wxKeyEvent
происходит от wxEvent
поэтому он не распространяется на родительский фрейм. Ну, вы можете использовать динамические обработчики событий для маршрутизации некоторых событий в любой из wxEvtHandler
производные объекты.
Под wxWidgets 2.8 вы должны использовать wxEvtHandler::Connect
, Этот метод описан здесь. Вы также можете посмотреть этот пример кода.
Под wxWidgets 2.9 и SVN вы должны использовать wxEvtHandler::Bind<>
:
MyFrame::MyFrame(...)
{
m_textcontrol->Bind(wxEVT_KEY_DOWN, &MyFrame::OnTextControlKeyDown, this);
}
wxEvtHandler::Bind<>
метод описан здесь.
Да, подкласс 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 );
}