在不同 DPI 下使用 GetWindowRect 的坐标误差

2023-11-30

我想捕获 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(使用前将#替换为@)

在不同 DPI 下使用 GetWindowRect 的坐标误差 的相关文章

随机推荐

  • 使用 R 3.6.0 编译 stan 文件时出错。和赢10

    Error in compileCode f code language language verbose verbose Compilation ERROR function s method s not created Error in
  • 将组件放置在玻璃板上

    我有一个 JLabel 的子类 它构成了我的 GUI 的一个组件 我已经实现了将组件从一个容器拖放到另一个容器的功能 但没有任何视觉效果 我想让这个 JLabel 在将项目从一个容器拖动到另一个容器时跟随光标 我想我可以创建一个玻璃板并在上
  • 禁用iOS弹性体滚动并保持本机滚动工作[重复]

    这个问题在这里已经有答案了 我目前正在开发一个针对触摸设备 主要是 iOS 进行优化的单页 Web 应用程序 我已经通过以下方式实现了新的 iOS 原生滚动 webkit overflow scrolling touch 一切运行良好 除了
  • Powershell 数组扁平化是如何工作的?

    请注意 C gt x 1 C gt x x 2 C gt x x 3 C gt x x 4 C gt x x 5 C gt x Length 2 C gt x Length 3 C gt x Length 2 LongLength 2 Ra
  • 如何在c#中导出注册表

    我一直在尝试将注册表文件导出并保存到任意位置 代码正在运行 但是 在指定路径并保存时 该功能不起作用 并且不会导出任何注册表 也没有显示错误 private static void Export string exportPath stri
  • git 子模块检查相同的提交

    After I git submodule update它总是检查相同的提交 例如34561 I do git checkout master对于子模块 然后git submodule sync 然后它指向最新的提交a2344 但是之后up
  • 在哪里可以查看 TensorFlow 梯度下降主循环?

    抱歉 如果这听起来有点天真 我想看看里面的肉TensorFlowGradientDescent 的实现 亲自看看它们如何处理终止条件 步长自适应性等 我追踪了代码training ops apply gradient descent但我找不
  • 不可变对象的名称如何重新绑定到增强赋值的结果?

    不可变对象的名称如何重新绑定到增强赋值的结果 对于可变对象 例如 如果x 1 2 3 并且 y 4 5 那么当我们执行 x y 时 它的执行方式为x iadd y 它修改了x in place并做了名字x再次重新绑定到它 它是如何工作的x是
  • 比“尝试”和“例外”更快的方法? - Python

    我经常将代码写成如下 try self title item title content string except AttributeError e self title None 有没有更快的方法来处理这个问题 一行 您遇到了哪些例外情
  • 在jspdf中添加自定义字体

    我想在 jsPDF 中使用自定义字体 例如 Comic Sans MS 或 Calibri 字体 我发现了类似的问题here 但我的不工作 我已经添加了最新的jspdf 我的代码如下 var doc new jsPDF p mm a4 do
  • swt表改变选择项颜色

    我正在使用一个标准的 swt 表 您可能知道 默认情况下 选择一个项目时颜色为蓝色 Windows 标准 当选择处于非活动状态时 它会变成浅灰色 我想覆盖这两种颜色 我在整个网络上进行了搜索 但只能找到一些非常旧的代码 这些代码似乎不再适用
  • PrototypeJS:如何选择动态创建的元素?

    该网站使用 Prototype JS 库 页面加载后 它立即执行 Ajax 请求 该请求会拉出并显示页面的更多元素 我需要能够选择那些动态创建的元素并将它们隐藏 hide method 我尝试使用选择并隐藏它们document observ
  • 从 XML 反序列化为列表对象

    我正在执行将 XML 文件转换为列表对象的程序 我已成功完成从 List 到 XML 的序列化 但是在进行反序列化时遇到问题 请任何人告诉我我在这段代码中做错了什么 这是我的 XML 代码
  • 设计可以标记多个数据库表的标记系统

    我希望允许用户标记项目 以便他们可以使用标签搜索它们 干净地实现这一目标的最佳方法是什么 到目前为止 我提出的解决方案仅涉及向我当前的数据库系统添加两个额外的表
  • 绘制 SEM 模型中与 R 中观察到的变量的交互效应

    我正在估计一个已观察到变量的 SEM 模型 我正在使用 SEM 来使用 FIML 处理缺失数据 我的模型有一个交互项来测试适度性 这是一个说明问题的玩具示例 library lavaan library car library dplyr
  • Cakephp生成xml错误-空格

    我正在尝试在 CakePHP 中生成动态 xml 文档以输出到浏览器 这是我的控制器代码 Configure write debug 0 this gt layout null header Content type text xml ec
  • 使用 itextpdf 时,横向和纵向 PDF 的页面大小始终相同

    我有一个 PDFReader 其中包含一些横向模式的页面和其他纵向模式的页面 我需要区分它们以进行一些处理 但是 如果我调用 getOrientation 或 getPageSize 则该值始终相同 页面大小为 595 方向为 0 为什么横
  • CSS 中的装饰艺术风格边框

    我希望使用纯 CSS 来实现这种边框效果 我的偏好是在不添加额外的 div 元素的情况下实现它 任何建议 将不胜感激 编辑 固定图像描述 你可以像下面这样做 box width 150px height 200px border 15px
  • Android:从网页获取 HTML 作为字符串,HttpClient 不起作用

    我正在编写一个使用 HttpClient 连接到网页的应用程序 目的是能够将网页的一些 HTML 复制到字符串中 我尝试使用 HttpClient 连接来完成此任务 这是我使用的代码 public void getText final Te
  • 在不同 DPI 下使用 GetWindowRect 的坐标误差

    我想捕获 MFC 程序中组件的坐标 现在我可以通过使用完美地完成这个GetWindowRect 但是 当我将 Windows dpi 设置为 150 120 dpi 时 我得到的坐标不同GetWindowRect 因此 我研究了一些将新坐标