Обработка событий из wxTextCtrl в wxFrame — C / wxWidgets

#c #events #user-interface #wxwidgets

#c #Мероприятия #пользовательский интерфейс #wxwidgets

Вопрос:

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

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

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

Каков наилучший способ сделать это?

Ответ №1:

События wxCommandEvent и wxNotifyEvent типа из дочерних элементов управления настроены на автоматическое распространение вверх в родительский фрейм. Однако wxKeyEvent является производным от wxEvent , поэтому он не распространяется на родительский фрейм. Ну, вы можете использовать динамические обработчики событий для маршрутизации некоторых событий в любой из wxEvtHandler производных объектов.

В wxWidgets 2.8 следует использовать wxEvtHandler::Connect . Этот метод описан здесь. Вы также можете взглянуть на этот пример кода.

В wxWidgets 2.9 и SVN следует использовать wxEvtHandler::Bind<> :

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

wxEvtHandler::Bind<> Метод описан здесь.

Ответ №2:

Да, подкласс wxTextCtrl для обработки нажатий клавиш в родительском фрейме.

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

и, конечно

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

В этом методе передайте событие в ваш MyFrame

 void cSpecialTextCtrl::OnKeyDown( wxKeyEventamp; ev )
{
  ((MyFrame*)GetParent())->OnKeyDown( ev );
}