Обработка событий из wxTextCtrl на wxFrame - C ++ / wxWidgets - PullRequest
3 голосов
/ 28 апреля 2011

У меня есть MyFrame, который происходит от wxFrame.A wxTextCtrl добавлено к этому кадру.Могу ли я обработать EVT_KEY_DOWN этого текстового элемента управления во фрейме?Что-то вроде

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

Код выше, похоже, не работает.Документация говорит, что подобные события могут быть обработаны только объектом, из которого происходит событие.Так должен ли я подкласс wxTextCtrl обработать это и каким-то образом отправить информацию во фрейм?

Как лучше всего это сделать?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2011

События типа 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<> описан здесь .

3 голосов
/ 28 апреля 2011

Да, подкласс 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 );
}
...