我想捕获 MFC 程序中组件的坐标。
现在我可以通过使用完美地完成这个GetWindowRect
。
但是,当我将 Windows dpi 设置为 150% (120 dpi) 时,我得到的坐标不同GetWindowRect
.
因此,我研究了一些将新坐标转换为默认 dpi(96 dpi)坐标的方法。
最后我尝试的时候发现出现了一些错误:
Rect.top = Rect.top * (DEFAULT_DPIY / CURRENT_DPIY);
Rect.left = Rect.left * (DEFAULT_DPIX / CURRENT_DPIX);
转换后的值非常接近,但不相等。
有什么方法可以不出错地转换它吗?
您的程序受 DPI 虚拟化的约束。处理此问题的正确方法是让您的程序具有高 DPI 感知能力,但这很可能涉及比您准备尝试的更多更改。
如果您不想解决高 DPI 感知问题,那么您至少可以使您的算术变得更好。您的代码使用整数除法。但这是不准确的。为了最大限度地减少这种不准确性,您应该在乘法之后执行除法:
Rect.top = (Rect.top * DEFAULT_DPIY) / CURRENT_DPIY;
Rect.left = (Rect.left * DEFAULT_DPIX) / CURRENT_DPIX;
当然,这里可以省略括号而不改变含义,但我认为在这种情况下明确操作的顺序是很好的。
另一种选择是使用MulDiv:
Rect.top = MulDiv(Rect.top, DEFAULT_DPIY, CURRENT_DPIY);
Rect.left = MulDiv(Rect.left, DEFAULT_DPIX, CURRENT_DPIX);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)