【问题标题】:Is it possible to catch mouse events in wxFrame是否可以在 wxFrame 中捕获鼠标事件
【发布时间】:2012-11-29 00:00:21
【问题描述】:

我一直在网上搜索并试图找出是否可以在 wxWidgets 中的实际 wxFrame 元素中捕获鼠标事件。各种消息来源说这是不可能的,应该使用 wxPanels 来捕获事件,这是真的吗?

谢谢

【问题讨论】:

    标签: c++ c ubuntu wxwidgets


    【解决方案1】:

    鼠标事件向上传播窗口层次结构,所以如果你的框架完全被其他窗口覆盖,那么它首先不会得到任何鼠标事件,因此你不能在那里抓住他们。

    当然,您始终可以使用Bind()wxFrame 类的方法中处理来自任何其他窗口的任何事件。例如:

    MyFrame::MyFrame(...)
        : wxFrame(...)
    {
        wxPanel* p = new wxPanel(this);
        p->Bind(wxEVT_MOTION, &MyFrame::OnMouseMotion, this);
    }
    

    将允许您以帧方法处理面板上发生的鼠标运动事件。

    【讨论】:

      【解决方案2】:

      大部分是真的。

      一些鼠标事件会进入框架,例如 wxEVT_ENTER(或其他任何名称)。其他人进入面板,例如wxEVT_RIGHT_UP。您可以将这些事件转发到框架。

      绑定到面板和框架中的事件。

      Bind(wxEVT_RIGHT_UP, &MyFrame::OnMouse, ptr_to_myframe);
      Bind(wxEVT_RIGHT_UP, &MyPanel::OnMouse, ptr_to_panel);
      

      然后(假设框架是面板的父级),

      void MyPanel::OnMouse(wxMouseEvent &event) {
          wxPostEvent(GetParent(), event);
      }
      

      如果面板是滚动的,您可能希望使用未滚动的坐标转发事件。

      void MyScrolledPanel::OnMouse(wxMouseEvent &event) {
          wxMouseEvent pevent(event);
          CalcUnscrolledPosition(event.GetX(), event.GetY(), &pevent.m_x, &pevent.m_y);
          wxPostEvent(GetParent(), pevent); 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2016-12-26
        相关资源
        最近更新 更多