我一直在网上搜索并试图找出是否可以在 wxWidgets 中的实际 wxFrame 元素中捕获鼠标事件。各种消息来源说这是不可能的,应该使用 wxPanels 来捕获事件,这是真的吗?
谢谢
鼠标事件不会向上传播窗口层次结构,因此如果您的框架完全被其他窗口覆盖,那么它首先不会获得任何鼠标事件,因此您无法在那里捕获它们。
当然,您始终可以wxFrame
使用Bind()
. 例如:
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);
}