gpt4 book ai didi

c++ - 在不同的 DPI 中使用 GetWindowRect 坐标错误

转载 作者:行者123 更新时间:2023-11-27 22:56:42 24 4
gpt4 key购买 nike

我想在我的 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);

关于c++ - 在不同的 DPI 中使用 GetWindowRect 坐标错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com