windows - 使 Windows 通用对话框 "Per Monitor DPI-Aware"

标签 windows mfc dpi dpi-aware

我有一个使用 MFC 在 VS2008 中创建的程序。 现在我已经修改它使其成为“每个监视器 DPI 感知”,并且它几乎完成了。我修改了 list 并处理了 WM_DPICHANGE 消息。但是还有一个问题:

我使用CFileDialog 类来显示打开/保存对话框,并使用SHBrowseForFolder 函数来显示文件夹选择对话框。但是所有这些对话框都不是“每显示器 DPI 感知”,当您在具有不同 DPI 设置的显示器之间移动它们时,它们不会调整它们的 UI。

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

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

有谁知道如何让这些对话框成为“Per Monitor DPI-Aware”?

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

还有两个问题:

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

我觉得这些问题可能有某种联系,但我想不通。

--------悲伤的消息--------

我用VS2013编译微软的《DPI Tutorial Sample》,也有同样的问题。

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

最佳答案

titlebar(标题栏)可以通过调用EnableNonClientDpiScaling进行缩放在 Windows >= Windows 10 周年更新 (1607) 版本上可用。

如果您想缩放不支持按监视器 DPI 缩放的旧对话框,您可以使用 SetThreadDpiAwarenessContext (使用 DPI_AWARENESS_CONTEXT_SYSTEM_AWARE 或 DPI_AWARENESS_CONTEXT_UNAWARE)让对话框的顶级窗口由 Windows 缩放。该对话框可能会模糊,但至少会正确调整大小(也仅适用于 >= 1607 版本的 Windows 10)。使用模式是在打开对话框之前调用此 API,然后在调用 API 后立即恢复之前的 DPI 上下文。

关于windows - 使 Windows 通用对话框 "Per Monitor DPI-Aware",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35454712/

相关文章:

c# - 如何绘制数学符号?

c - 如何在 Windows 上用 c 中的 ctrl+c 结束 while 循环?

file - 如何删除被锁定的文件?

android - 如何根据android中的设备dpi设置与宽度成比例的高度

java - 我应该在 Windows 上将应用程序缓存存储在哪里?

windows - iperf UDP 服务器启动错误,绑定(bind)失败 : Operation not permitted

c++ - MFC:如何将多个窗口停靠在同一位置?

c++ - 在哪里可以找到 C++/MFC 的提要库?

android - iPhone 屏幕 DPI 等效于 Android 分辨率

delphi - 对 Windows Vista 和 Windows 7 中的 DPI 虚拟化和 DPI 感知应用程序进行故障排除