处理来自 wxFrame 上的 wxTextCtrl 的事件 - C++/wxWidgets

发布于 2024-11-03 15:02:02 字数 368 浏览 3 评论 0原文

我有一个从 wxFrame 派生的 MyFramewxTextCtrl 被添加到该框架中。我可以在框架中处理此文本控件的 EVT_KEY_DOWN 吗?比如,

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

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

这样做的最佳方法是什么?

I have a MyFrame which derives from wxFrame. A wxTextCtrl is added to this frame. Can I handle EVT_KEY_DOWN of this text control in frame? Something like,

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

The above code seems to be not working. Documentation says events like this can only be handled by the object where the event is originated. So should I subclass wxTextCtrl to handle this and somehow send the information to frame?

What is the best way of doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酒废 2024-11-10 15:02:02

来自子控件的 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<> 方法描述为 此处

The wxCommandEvent and wxNotifyEvent type events from a child controls are set to propagate upward to the parent frame automatically. However, the wxKeyEvent is derived from the wxEvent so it is not propagating to the parent frame. Well, you may use dynamic event handlers to route some of the events to any of wxEvtHandler derived objects.

Under wxWidgets 2.8 you should use wxEvtHandler::Connect. This method is described here. You may also look at this sample code.

Under wxWidgets 2.9 and SVN you should use wxEvtHandler::Bind<>:

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

The wxEvtHandler::Bind<> method is described here.

快乐很简单 2024-11-10 15:02:02

是的,子类化 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 );
}

Yes, subclass wxtextCtrl to handle the key presses in the parent frame.

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

and of course

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

In the method, pass the event to your MyFrame

void cSpecialTextCtrl::OnKeyDown( wxKeyEvent& ev )
{
  ((MyFrame*)GetParent())->OnKeyDown( ev );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文