a784572704 2025-02-23 12:30 采纳率: 0%
浏览 7

MFC CScrollView视图缩放,坐标与屏幕坐标有偏差

最近在写一个项目,读取CAD图纸并显示到CScrollView类上,采用direct2d进行渲染并缩放,并且动态生成每个车位的按钮信息
但是在进行缩放平移的时候,车位按钮计算的坐标与渲染现实后的车位坐标无法精确匹配
如图

1、当满铺屏幕时,车位与按钮可以匹配的很好

img

2、当图形往左侧移动时,按钮明显偏离车位,偏左侧

img

3,当图形往右侧移动时,按钮明显偏移车位,这次往右偏

img

生成的按钮控件是根据逻辑坐标转换为view坐标并减去vieworg计算得来的,数据没错,但无法理解这个偏移是怎么产生的
请问这是什么原因产生的?我被整不会了

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-02-23 12:30
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    MFC CScrollView 视图缩放,坐标与屏幕坐标有偏差

    你遇到的问题是,在使用 MFC 的 CScrollView 类时,缩放和平移视图后,坐标计算的结果与实际渲染后的坐标有偏差。这个问题是因为 CScrollView 使用了一个名为 MapToScreen 的函数来将逻辑坐标转换为屏幕坐标,但是这个函数并不是线性的。

    解决这个问题的一种方法是,使用 ClientToScreen 函数来将逻辑坐标转换为屏幕坐标,然后使用 ScreenToClient 函数来将屏幕坐标转换回逻辑坐标。这样可以避免 MapToScreen 函数的非线性问题。

    例如:

    CPoint point = ...; // 逻辑坐标
    CPoint screenPoint = point;
    ClientToScreen(&screenPoint);
    // 现在 screenPoint 是屏幕坐标
    

    如果你需要在缩放和平移时保持坐标的正确性,可以使用 OnSize 函数来更新坐标。例如:

    void MyScrollView::OnSize(UINT nType, int cx, int cy)
    {
        CScrollView::OnSize(nType, cx, cy);
        // 更新坐标
        CPoint point = ...; // 逻辑坐标
        CPoint screenPoint = point;
        ClientToScreen(&screenPoint);
        // 更新坐标
    }
    

    这些方法可以帮助你解决坐标计算的偏差问题,但是如果你遇到更多的问题,可能需要更多的信息和代码来 debug。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月23日