阿里嘎多学长整理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。