我一直在搜索網絡並試圖找出是否有可能在wxWidgets中的實際wxFrame元素中捕獲鼠標事件。各種消息稱,這是不可能的,wxPanels應該用來捕捉事件,這是真的嗎?是否有可能在wxFrame中捕獲鼠標事件
謝謝
我一直在搜索網絡並試圖找出是否有可能在wxWidgets中的實際wxFrame元素中捕獲鼠標事件。各種消息稱,這是不可能的,wxPanels應該用來捕捉事件,這是真的嗎?是否有可能在wxFrame中捕獲鼠標事件
謝謝
大部分是正確的。
某些鼠標事件轉到框架,如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);
}
鼠標事件不向上傳播的窗口層次結構,因此,如果你的框架完全被其他窗口覆蓋,那麼它不會得到任何鼠標事件擺在首位,因此你不能趕上他們在那裏。
當然,您可以隨時使用Bind()
以wxFrame
類的方法處理任何其他窗口中的任何事件。例如:
MyFrame::MyFrame(...)
: wxFrame(...)
{
wxPanel* p = new wxPanel(this);
p->Bind(wxEVT_MOTION, &MyFrame::OnMouseMotion, this);
}
將允許你處理的鼠標移動事件發生在幀中的方法中的面板。