DPI缩放与C ++中Windows生成的对话框?

问题描述 投票:0回答:1

我正在尝试适当地DPI缩放C ++中的应用程序,但是我无法使它与通过从commdlg.h调用OPENFILENAMEW创建的文件选择器窗口一起使用。

我正在使用三台显示器:两台具有1.0 dpi,另一台具有2.5 dpi。对我而言,无论我的应用程序位于哪个窗口中,文件选择器都仅以1.0 DPI打开。因此,当我将文件选择器拖动到2.5 dpi监视器时,该窗口是如此之小,难以阅读。当我断开其他显示器的连接时,只能以2.5 dpi缩放它。我查看了OPENFILENAMEW的文档,并有一个标志允许对话手动调整大小,仅此而已。

它必须在某个点上按比例缩放dpi,但我找不到它。有人知道该怎么做吗?

c++ windows dialog dpi highdpi
1个回答
0
投票

在清单设置中为每个监视器启用DPI意识并不能完全解决问题,但这确实使我找到了所需的答案!因此,仍然存在的问题是,一旦创建了文件选择器窗口,即使将其移动到具有不同DPI的窗口后,它仍保持其DPI缩放比例与原始窗口不符。

显然,清单中的选项不支持此功能,shellscaling api中的SetProcessDpiAwareness函数也不支持,该函数可用于以编程方式设置该清单设置。

但是,winuser.h中的SetProcessDpiAwarenessContext还有一个其他选项没有的选项:DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2。这只能在具有Creators更新的Windows计算机(名为Redstone 2)上使用,并且可以检查是否可以正确进行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);
}

这可行!

© www.soinside.com 2019 - 2024. All rights reserved.