坐标错误使用GetWindowRect在不同的DPI
Coordinate Error using GetWindowRect in different DPI
我想在我的MFC程序中捕获组件的坐标。
现在我可以用GetWindowRect
完美地完成这个。但是,当我将窗口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);
相关文章:
- GetWindowRect 未正确给出左值和顶部值
- 当DPI感知,全屏和无框时,客户区域在WM_NCACTIVATE上擦除
- System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行另一个并行线程
- GetWindowRect()返回的大小小于游戏的实际可见窗口的可能原因是什么
- 是否有提供可调整 dpi、可选文本和 CSS 支持的 HTML 到 PDF 渲染器?
- 在Qt5中缩放高DPI图像的最佳方法是什么?
- 是否可以在DPI中指定图标的大小或类似的内容
- Dealing with DPI and ID2D1RenderTarget::DrawBitmap
- 如何使MFC CToolbar按钮更加一致,以使Windows 7/10上的高DPI了解应用程序
- 在通过CPP项目开放时,为什么C#Winform与DPI 150%不同
- 如何在 DPI 感知设置为DPI_AWARENESS_CONTEXT_UNAWARE的情况下创建进程
- QIcon 始终显示为 2x dpi
- 如何通过 TWAIN 获取扫描仪的当前 DPI 设置
- QGraphicsView scaling with High DPI
- 使用DPI从C 函数中从SV中的读取值错误
- 创建后更改窗口的 DPI 感知
- chtmlview中的网页具有高DPI(150%)的显示错误
- Set DPI for QImage
- QTextDocument::d rawContents 仅以 96 dpi 呈现
- 坐标错误使用GetWindowRect在不同的DPI