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

Is it possible to catch mouse events in wxFrame

本文关键字:鼠标 事件 wxFrame 是否      更新时间:2023-10-16

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

谢谢

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

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

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

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

大部分是真的。

一些鼠标事件会转到帧,例如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); 
}