使Windows通用对话框"每个监视器DPI感知"

Cas*_*Lee 7 windows mfc dpi dpi-aware

我有一个在VS2008中使用MFC创建的程序.现在我已经修改它以使其成为"Per Monitor DPI-Aware",它几乎已经完成了.我修改了清单并处理了WM_DPICHANGE消息.但仍有一个问题:

我使用CFileDialog类来显示打开/保存对话框,并使用SHBrowseForFolder函数显示文件夹选择对话框.但是,所有这些对话都是 "每个监视器DPI感知",当你与不同的DPI设置显示器之间移动他们,他们不会调整自己的UI.

我使用spy ++来监视这些对话框的消息,我发现它们可以接收WM_DPICHANGED消息,但它们只是不处理它.

我已经在Windows 10上的notepad.exe中测试了打开的文件对话框,它运行得很好.

有谁知道如何使这些对话框"Per Monitor DPI-Aware"?

-------- 编辑 --------

还有两个问题:

  1. 当我将窗口移动到具有不同DPI的监视器时,窗口会自行调整大小,但标题栏和标题字体大小的高度不会更改.
  2. 复选框控件的框大小也不会更改.

我觉得这些问题可能有某种联系,但我无法弄清楚.

-------- SAD NEWS --------

我用VS2013编译了microsoft的"DPI Tutorial Sample",它也有同样的问题.

https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744

Sim*_*man 0

根据MSDN,处理消息的窗口WM_DPICHANGED应该返回 0。但是,您发送的任何 MFC 窗口或控件WM_DPICHANGED都将返回 0,因为它们会为未知消息调用默认窗口过程。

\n\n

WM_DPICHANGED因此,通过测试某个窗口的LRESULT返回值是否为零来判断某个窗口是否处理消息是不准确的。

\n\n

正如MSDN上所述,在不同 DPI 显示器之间移动时,每个显示器 DPI 感知应用程序的窗口标题栏不会缩放。不幸的是,窗口的非客户区永远不会调整 DPI。

\n\n

计算器和其他支持每显示器 DPI 的 Windows 本机应用程序具有自定义标题栏绘图,如此处所述

\n