【问题标题】:DPI Scaling with windows-generated dialogues in C++?在 C++ 中使用 Windows 生成的对话进行 DPI 缩放?
【发布时间】:2020-01-10 23:53:02
【问题描述】:

我正在尝试在 C++ 中正确地对应用程序进行 DPI 缩放,但我无法让它与通过从 commdlg.h 调用 OPENFILENAMEW 创建的文件选择器窗口一起工作。

我使用三台显示器:两台 1.0 dpi,一台 2.5 dpi。对我来说,无论我的应用程序在哪个窗口中,文件选择器都只能以 1.0 DPI 打开。因此,当我将文件选择器拖到 2.5 dpi 监视器时,窗口太小而难以阅读。当我断开其他显示器时,我只能以 2.5 dpi 进行缩放。我查看了 OPENFILENAMEW 的文档,并且有一个标志允许手动调整对话框的大小,仅此而已。

它必须在某个点注册 dpi 以进行缩放,但我找不到它。 有谁知道怎么做?

【问题讨论】:

  • 如果您使用的是 Visual Studio,您需要启用“Manifest”文件的生成,然后在 Project->Properties->Manifest Tools->Input and Output 中选择“Per Monitor High DPI “DPI Awareness”选项中的“Aware”。
  • 谢谢阿德里安!这并没有完全解决我在监视器之间的缩放问题,但它让我研究了解决问题的 API。

标签: c++ windows dialog dpi highdpi


【解决方案1】:

在清单设置中启用每台显示器的 DPI 感知并不能完全解决这个问题,但它确实让我找到了我正在寻找的答案!所以一直存在的问题是,一旦创建了文件选择器窗口,即使在将其移动到具有不同 DPI 的窗口之后,它仍保持其原始窗口的 DPI 比例。

显然 Manifest 中的选项不支持这一点,shellscaling api 中的 SetProcessDpiAwareness 函数也不支持,该函数可用于以编程方式设置 Manifest 设置。

但是,来自 winuser.h 的 SetProcessDpiAwarenessContext 有一个其他选项没有的选项:DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2。这只能在带有 Creators 更新(名为 Redstone 2)的 Windows 机器上使用,并且您可以检查是否可以正确地进行 DPI 缩放,如果不能,则尽可能正确地进行 DPI 缩放:

if (IsWindowsVersionOrGreater(HIBYTE(NTDDI_WIN10_RS2), LOBYTE(NTDDI_WIN10_RS2), 0)) {
      SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
}
else {
      SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
}

这行得通!

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2012-02-22
    • 2014-11-22
    • 2020-05-18
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2018-04-11
    相关资源
    最近更新 更多