C++ 是否可以在wxFrame中捕获鼠标事件

C++ 是否可以在wxFrame中捕获鼠标事件,c++,c,ubuntu,wxwidgets,C++,C,Ubuntu,Wxwidgets,我一直在搜索web,试图找出是否有可能在wxWidgets中的实际wxFrame元素中捕获鼠标事件。各种消息来源说这是不可能的,应该使用wxpanel来捕获事件,这是真的吗 谢谢基本上是真的 一些鼠标事件进入帧,如wxEVT_ENTER(或其他任何名称)。其他人进入面板,例如wxEVT_RIGHT_UP。您可以将这些事件转发到帧 Bind(wxEVT_RIGHT_UP, &MyFrame::OnMouse, ptr_to_myframe); Bind(wxEVT_RIGHT_UP, &a

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

谢谢

基本上是真的

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

Bind(wxEVT_RIGHT_UP, &MyFrame::OnMouse, ptr_to_myframe);
Bind(wxEVT_RIGHT_UP, &MyPanel::OnMouse, ptr_to_panel);
绑定到面板和框架中的事件

Bind(wxEVT_RIGHT_UP, &MyFrame::OnMouse, ptr_to_myframe);
Bind(wxEVT_RIGHT_UP, &MyPanel::OnMouse, ptr_to_panel);
然后(假设框架是面板的父级)

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

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

鼠标事件是而不是在窗口层次结构中向上传播的,因此,如果您的帧完全被其他窗口覆盖,那么它首先不会获取任何鼠标事件,因此您无法在那里捕获它们

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

MyFrame::MyFrame(...)
    : wxFrame(...)
{
    wxPanel* p = new wxPanel(this);
    p->Bind(wxEVT_MOTION, &MyFrame::OnMouseMotion, this);
}
将允许您以帧方法处理面板上发生的鼠标移动事件