【问题标题】:Handling events from wxTextCtrl on wxFrame - C++/wxWidgets在 wxFrame 上处理来自 wxTextCtrl 的事件 - C++/wxWidgets
【发布时间】:2011-08-14 09:30:42
【问题描述】:

我有一个源自wxFrameMyFrame。一个wxTextCtrl 被添加到这个框架中。我可以在框架中处理此文本控件的EVT_KEY_DOWN 吗?类似的,

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

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

最好的方法是什么?

【问题讨论】:

    标签: c++ events user-interface wxwidgets


    【解决方案1】:

    来自子控件的wxCommandEventwxNotifyEvent 类型事件被设置为自动向上传播到父框架。但是,wxKeyEvent 是从 wxEvent 派生的,因此它不会传播到父框架。好吧,您可以使用动态事件处理程序将一些事件路由到任何wxEvtHandler 派生对象。

    在 wxWidgets 2.8 下,您应该使用wxEvtHandler::Connect。此方法描述为here。你也可以看看this sample code

    在 wxWidgets 2.9 和 SVN 下你应该使用wxEvtHandler::Bind<>:

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

    wxEvtHandler::Bind<> 方法描述为here

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-06
        • 2021-08-06
        • 1970-01-01
        • 2019-08-27
        • 2018-10-15
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        相关资源
        最近更新 更多