处理事件从wxTextCtrl在wxFrame - c++ /wxWidgets

Handling events from wxTextCtrl on wxFrame - C++/wxWidgets

本文关键字:c++ wxWidgets wxFrame wxTextCtrl 处理事件      更新时间:2023-10-16

我有一个由wxFrame派生的MyFrame。在此框架中添加一个wxTextCtrl。我可以在框架中处理这个文本控件的EVT_KEY_DOWN吗?类似的,

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

上面的代码似乎不工作。文档说明这样的事件只能由事件起源的对象来处理。那么我应该子类wxTextCtrl来处理这个并以某种方式将信息发送到帧吗?

做这件事的最好方法是什么?

子控件的wxCommandEventwxNotifyEvent类型事件被设置为自动向上传播到父框架。然而,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 );
}