“使Windows成为通用对话框”;每台监视器DPI感知”功能;

“使Windows成为通用对话框”;每台监视器DPI感知”功能;,windows,mfc,dpi,dpi-aware,Windows,Mfc,Dpi,Dpi Aware,我有一个程序是在VS2008中用MFC创建的。 现在我对它进行了修改,使其成为“每监视器DPI感知”,并且几乎完成了。我已经修改了清单并处理了WM_DPICHANGE消息。但还有一个问题: 我使用CFileDialog类显示打开/保存对话框,并使用SHBrowseForFolder函数显示文件夹选择对话框。但是,所有这些对话框都是而不是“每监视器DPI感知”,当您在具有不同DPI设置的监视器之间移动它们时,它们不会调整其UI 我使用spy++监视这些对话框的消息,我发现它们可以接收WM_DPIC

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

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

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

我在Windows 10上测试了notepad.exe中的“打开文件”对话框,它工作得非常好

是否有人知道如何使这些对话框“每个监视器DPI感知”

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

还有两个问题:

  • 当我将窗口移动到具有不同DPI的显示器时,窗口会自行调整大小,但其标题栏的高度和标题字体大小不会改变
  • 复选框控件的框大小也没有更改
  • 我觉得这些问题可能有某种联系,但我想不出来

    --------不幸的消息--------

    我用VS2013编译了微软的“DPI教程示例”,它也有同样的问题

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

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

    每个监视器DPI感知应用程序的窗口标题栏在跨不同DPI监视器移动时不可缩放,如上所述。不幸的是,窗口的非客户端区域从不调整DPI

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

    标题栏(标题栏)可以通过调用进行缩放,此功能可在Windows版本>=Windows 10周年更新(1607)上使用


    如果要DPI缩放不支持每监视器DPI缩放的旧对话框,可以使用(DPI_感知_上下文_系统感知或DPI_感知_上下文_不感知)按窗口缩放对话框的顶级窗口。对话框可能模糊,但至少大小正确(也仅适用于>=1607版本的Windows 10)。使用模式是在打开对话框之前调用此API,然后在调用API后立即恢复以前的DPI上下文

    嗯,你通常不会。您正在使用的那些对话框已过时。对于“打开/保存/浏览”文件夹,您现在可以使用,特别是
    IFileOpenDialog
    。这些在Windows Vista和更高版本上可用,并且应该已经支持DPI。回到底层操作系统上较旧的对话框。顺便说一句,从VS2012(或VS2010不太确定)开始,CFileDialog自动使用公共项对话框,无需任何额外工作。@Cody Gray我检查了“mfc\dlgfile.cpp”中的代码,发现CFileDialog calss确实使用了IFileDialog来显示对话框<代码>如果(m_bVistaStyle==TRUE){applyofnthellDialog();HRESULT hr=(static_cast(m_pIFileDialog))->显示(m_of n.hwndOwner);nResult=(hr==S_OK)?IDOK:IDCANCEL;}@Michael Walz实际上在VS2008中,如果您在Windows Vista或更高版本中运行,CFileDialog还使用IFileDialog并将bVistaStyle设置为TRUE。(bVistaStyle默认设置为TRUE)[link]嗯,好的。我很惊讶他们一直更新MFC。好东西。那我就不知道了。您不必在自己的代码中做任何事情来使内置的公共对话框工作。可能只是因为DPI支持在那里被破坏了,就像在Windows的许多地方一样。不幸的是,我没有一个监视器运行不同DPI的系统,所以我无法为您检查它。