#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 );
}