wxWidgets OnMouseMotion拖动绘图区出现随机窗口报SetFocus失败
问题背景
我有多个图表组件,单个图表逻辑上由绘图区(Plot Area)和其他元素构成,图表的部分内容在绘图区内绘制,用户可通过如下代码在顶层窗口移动绘图区:
void CPlotArea::OnMouseMotion(wxMouseEvent& event) { wxClientDC dc(GetParentWindow()); wxPoint pos = event.GetLogicalPosition(dc); if ( event.LeftIsDown() && (event.ControlDown() || event.AltDown()) ) { wxSize distance(pos.x - m_LeftDownPos.x, pos.y - m_LeftDownPos.y); //dont allow too much movements (suddenly plot area gets lost) if (std::abs(distance.x) > 20 || std::abs(distance.y) > 20) { m_LeftDownPos = pos; event.Skip(); return; } Move(distance); m_LeftDownPos = pos; GetParentWindow()->Refresh(); } event.Skip(); }
移动绘图区时用户必须按住 Control 键或 Alt 键。
对应的移动函数实现如下:
void CPlotArea::Move(const wxSize& dist) { wxPoint start = m_BoundingRect.GetTopLeft(); wxPoint End = m_BoundingRect.GetBottomRight(); start += dist; End += dist; m_BoundingRect = wxRect(start, End); }
事件转发逻辑
绘图区的事件消息由ChartBase类转发,以鼠标左键按下事件为例,转发逻辑如下:
if (PlotArea && PlotArea->GetBoundingRect().Contains(pos)) { wxMouseEvent MouseEvent(evt); MouseEvent.SetAltDown(evt.AltDown()); MouseEvent.SetControlDown(evt.ControlDown()); MouseEvent.SetEventType(ssEVT_PLOTAREA_ONLEFTDOWN); wxPostEvent(PlotArea, MouseEvent); return; }
鼠标移动事件的转发逻辑与上述逻辑完全一致。
问题现象
- 部分图表移动绘图区时无异常,但其中一个图表移动绘图区时,窗口左上角会出现来源不明的随机窗口,点击该窗口会报错:SetFocus failed with error 0x00000057,异常效果参考截图:

- 异常触发规律明确:
- 仅按住Control键拖动时会出现随机窗口,按住Alt键拖动无异常
- 若先按鼠标左键再按Control键操作正常,若先按Control键再按鼠标左键拖动就会触发问题,松开Control键后所有功能恢复正常
- 复现条件:该问题在Debug和Release模式下均可复现,当前开发环境为VS 2022、wxWidgets 3.1.7、Windows 10
请问该问题如何解决,或至少如何阻止该随机窗口出现?
内容的提问来源于stack exchange,提问作者macroland
相关产品推荐
相关产品推荐

