You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:27:51