【问题标题】:Windows device coordinates vs virtual coordinatesWindows 设备坐标与虚拟坐标
【发布时间】:2014-07-03 00:18:07
【问题描述】:

我试图在 MSDN 上找到这个问题的答案,但我没有清楚地了解它是如何工作的。我所有的工作都在 Windows 8.1 上。

这是我的问题。我正在使用具有 3200x1800 高分辨率显示器的笔记本电脑。我一直在使用 EnumDisplayMonitors 来获取屏幕的边界矩形。

如果我的显示设置是默认设置,这似乎可以正常工作。但是我注意到,当我更改窗口显示设置以提供更大的文本时,EnumDisplayMonitor 返回的分辨率会发生变化。而不是获得 3200x1800,我将获得 2133x1200。

我猜是因为我要求更大的文本,Windows 选择将屏幕表示为更小的分辨率。

如果我查看虚拟屏幕属性,似乎所有内容都以我屏幕的实际坐标表示,即 3200x1800。但是用于获取窗口和监视器矩形的 API 似乎是在这个“其他”坐标空间上运行的。

是否有任何文档/Windows API 来处理这些“其他坐标”和“虚拟坐标”之间的转换?即,如果我希望 EnumDisplayMonitor 或 GetMonitorInfo 给我真实的屏幕坐标,我该如何将 2133x1200 转换为 3200x1800?

【问题讨论】:

    标签: windows coordinates


    【解决方案1】:

    您已将视频适配器的 DPI 提高到 150%(每英寸 144 个点)以保持文本可读性并避免窗口大小为邮票大小。在这样的高分辨率显示器上非常必要。但是你还没有告诉 Windows 你的程序知道如何处理它。

    因此,它假定您的程序是一个旧的,从未设计为在此类监视器上运行。它对你有帮助,对你撒谎。它让您的程序将其输出渲染到内存缓冲区,然后获取该输出,将其重新缩放 150% 并将其复制到视频适配器。这是您可以看到的,如果您将程序的输出放在不要求这种缩放的程序(如记事本)旁边,文本看起来会更模糊。

    当然,当您询问屏幕尺寸时,它会由您自己决定。它告诉你它比实际小 150%。这样,在重新缩放后,您创建的窗口将填满屏幕。

    这一切都很好,但当然不理想,您的程序看起来不如它应该的那么好。 You have to tell Windows 知道如何处理更高的分辨率。请注意,这看起来比实际上更容易。让文本看起来清晰是微不足道的,问题在于位图。总的来说,这是一个丰富的错误来源,甚至是big companies can get this wrong

    【讨论】:

    • 啊,这就是我想的答案。我变得非常困惑,因为无论我更改什么,我从枚举监视器设备中收到的 DPI 总是相同的。但决议一直在变化。听起来Windows在骗我。那么现在对于跟进 的问题,如果我希望暂时不知道 我的应用程序DPI,那么找出DPI 的最简单方法是什么?有什么方法可以计算吗?
    • 如果您喜欢被骗,那么您根本不在乎它可能是什么。您只需假设 96 dpi。
    • 但我想知道各种显示器和窗口的真正分辨率是多少。似乎 Windows 提供的用于执行此操作的所有 API 仅在我的应用程序是“DPI Aware”时才有效。所以我想知道我是否可以在不知道 DPI 的情况下进行这些转换。
    • 关闭谎言需要声明你的程序 dpiAware。坚如磐石的要求。
    • 嗯,我注意到的一件事是,即使我的显示器分辨率报告为 2133x1200,如果我使用设备枚举来获取显示器分辨率,它也会报告 3200x1800。使用这些数据来估计 DPI 以便我进行适当调整是否安全?
    【解决方案2】:

    在我开始回答之前,让我问一下:你真正想要做什么?或者更具体 - 为什么需要知道显示器分辨率?执行此操作的标准方法是调用 GetWindowRect(GetDesktopWindow(), &rect) 我不确定屏幕坐标是否会根据 DPI 设置而更改 - 但您应该尝试使用它而不是 GetMonitorInfo,因为后者用于更高级的东西。如果 GetWindowRect 仍然返回一个缩放的矩形,只需调用DPtoLPLPtoDPother mapping coordinate function 就可以了。

    当您按照描述调整显示设置时,实际上是在更改屏幕的 DPI 设置。因此,某些 API 会进入兼容模式,以便应用在不了解此设置的情况下创建更大的元素和窗口。

    为什么您需要知道实际的屏幕分辨率,因为大多数窗口 API 会在 DPI 缩放发生变化时做出相应的行为?

    我怀疑您可以调用 SetProcessDPIAware 或等效的清单文件。但请先阅读this MSDN article 以了解 DPI 缩放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多