wxWidgets中如何从子wxScrollWindow内部触发父wxScrollWindow水平滚动
wxScrolledWindow嵌套时水平滚动事件透传实现方案

实现逻辑
子垂直滚动窗口仅响应垂直方向滚动事件,所有水平方向滚动事件(含按住Shift触发的模拟水平滚动)直接转发给父级水平滚动窗口处理,不需要修改父窗口原有逻辑。
具体实现步骤
C++ 版本
- 给子垂直wxScrolledWindow绑定鼠标滚轮事件
在子窗口的初始化代码中添加绑定逻辑:
Bind(wxEVT_MOUSEWHEEL, &ChildScrolledWnd::OnMouseWheel, this);
- 实现滚轮事件处理函数
void ChildScrolledWnd::OnMouseWheel(wxMouseEvent& event) { // 识别水平滚动场景:原生横向滚轮滚动/按住Shift触发的模拟水平滚动 const bool isHorizontalScroll = event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown(); if (isHorizontalScroll) { // 转发事件给父级水平滚动窗口 wxScrolledWindow* parentHScroll = dynamic_cast<wxScrolledWindow*>(GetParent()); if (parentHScroll) { wxMouseEvent evtCopy = event; evtCopy.SetEventObject(parentHScroll); parentHScroll->GetEventHandler()->ProcessEvent(evtCopy); } return; } // 垂直滚动走窗口默认处理逻辑 event.Skip(); }
wxPython 版本
- 绑定滚轮事件
self.child_v_scroll.Bind(wx.EVT_MOUSEWHEEL, self.on_mouse_wheel)
- 实现事件处理函数
def on_mouse_wheel(self, event): # 识别水平滚动场景 is_horizontal = event.GetWheelAxis() == wx.MOUSE_WHEEL_HORIZONTAL or event.ShiftDown() if is_horizontal: parent_h_scroll = self.GetParent() if isinstance(parent_h_scroll, wx.ScrolledWindow): evt_copy = wx.MouseEvent(event.GetEventType()) evt_copy.SetWheelDelta(event.GetWheelDelta()) evt_copy.SetWheelRotation(event.GetWheelRotation()) evt_copy.SetEventObject(parent_h_scroll) parent_h_scroll.GetEventHandler().ProcessEvent(evt_copy) return # 垂直滚动走默认逻辑 event.Skip()
特殊场景适配
如果子滚动窗口内部的按钮、输入框等控件拦截了滚轮事件,给这些控件也绑定上述相同的滚轮事件处理函数即可。
内容的提问来源于stack exchange,提问作者Anoop Rana
相关产品推荐
相关产品推荐

