Обработка событий из 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 );
}
Другие вопросы по тегам