Winapi DPI从资源中缩放一个完整的对话框

Winapi DPI从资源中缩放一个完整的对话框,winapi,dialog,controls,dpi,Winapi,Dialog,Controls,Dpi,我在Win32应用程序中设置了每监视器DPI缩放,我的部件工作正常,但是打开在资源编辑器中创建的对话框并不能自行缩放(我认为使用对话框单元是可以的) 有没有一种方法可以从对话框资源扩展所有内容,并与Win8.1、Win10甚至Win7兼容? 建议更新桌面应用程序以使用 每监视器DPI感知模式,允许它们立即渲染 只要DPI发生更改,就可以正确执行当应用程序向报告时 要在此模式下运行的Windows,Windows将不会位图 当DPI更改时拉伸应用程序,而不是发送 WM_dpi已更改为应用程序窗口。

我在Win32应用程序中设置了每监视器DPI缩放,我的部件工作正常,但是打开在资源编辑器中创建的对话框并不能自行缩放(我认为使用对话框单元是可以的)

有没有一种方法可以从对话框资源扩展所有内容,并与Win8.1、Win10甚至Win7兼容?

建议更新桌面应用程序以使用 每监视器DPI感知模式,允许它们立即渲染 只要DPI发生更改,就可以正确执行当应用程序向报告时 要在此模式下运行的Windows,Windows将不会位图 当DPI更改时拉伸应用程序,而不是发送 WM_dpi已更改为应用程序窗口。然后是完整的 应用程序处理为应用程序调整自身大小的责任 新新闻部。桌面应用程序(Windows)使用的大多数UI框架 通用控件(comctl32)、Windows窗体、Windows演示文稿 框架等)不支持自动DPI缩放,需要 开发人员需要重新调整窗口内容的大小和位置 他们自己

您可以在
WM\DPICHANGED
消息中调整对话框的大小

    case WM_DPICHANGED:
    {
        LPRECT lpRect = (LPRECT)lParam;
        SetWindowPos(hWnd, nullptr, lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, SWP_NOZORDER | SWP_NOACTIVATE);
        return 0;
    }
更新:

对于每监视器DPI,v2是唯一可以处理对话框DPI比例的显示器。v1在WIndows 8.1和WIndows 10的旧版本上不是这样,必须手动完成。在Windows8.1和旧版Windows10中,我们没有缩放控件。因此,解决方案应该是调整对话框的大小。如果对话框无法调整大小,则必须枚举所有控件并在WM_dpichange期间调整它们的大小。

建议更新桌面应用程序以使用 每监视器DPI感知模式,允许它们立即渲染 只要DPI发生更改,就可以正确执行当应用程序向报告时 要在此模式下运行的Windows,Windows将不会位图 当DPI更改时拉伸应用程序,而不是发送 WM_dpi已更改为应用程序窗口。然后是完整的 应用程序处理为应用程序调整自身大小的责任 新新闻部。桌面应用程序(Windows)使用的大多数UI框架 通用控件(comctl32)、Windows窗体、Windows演示文稿 框架等)不支持自动DPI缩放,需要 开发人员需要重新调整窗口内容的大小和位置 他们自己

您可以在
WM\DPICHANGED
消息中调整对话框的大小

    case WM_DPICHANGED:
    {
        LPRECT lpRect = (LPRECT)lParam;
        SetWindowPos(hWnd, nullptr, lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, SWP_NOZORDER | SWP_NOACTIVATE);
        return 0;
    }
更新:


对于每监视器DPI,v2是唯一可以处理对话框DPI比例的显示器。v1在WIndows 8.1和WIndows 10的旧版本上不是这样,必须手动完成。在Windows8.1和旧版Windows10中,我们没有缩放控件。因此,解决方案应该是调整对话框的大小。如果对话框无法调整大小,则必须枚举所有控件,并在WM_dpichange期间调整它们的大小。

至少在Windows 10(1703及更高版本)中,您应该可以获得。您是否可以提供一个对话框资源,在Windows 10(1703及更高版本)上无法产生所需效果?您的意思是,在资源编辑器中创建的对话框在更改dpi后将变得模糊?我的意思是,设置为150%,并且所有内容都变大,但对话框没有。应用程序被标记为dpi per monitor aware,因为主窗口和我可以处理它。对话框打开时的大小与100%dpi时的大小相同。我的surface pro 4死掉了,所以等着新的4k屏幕7看看它有多小。至少在Windows10(1703及更高版本)上,你应该得到它。您是否可以提供一个对话框资源,在Windows 10(1703及更高版本)上无法产生所需效果?您的意思是,在资源编辑器中创建的对话框在更改dpi后将变得模糊?我的意思是,设置为150%,并且所有内容都变大,但对话框没有。应用程序被标记为dpi per monitor aware,因为主窗口和我可以处理它。对话框打开时的大小与100%dpi时的大小相同。我的surface pro 4在等待新的4k屏幕7的时候就死了,问题是怎么做。如何根据资源缩放完整的对话框?我想你应该把它加载到某个内存位置,解析一些结构树更新东西,但不确定。似乎对话应该自己做。我知道Win10中有一个线程级选项,但需要支持8.1。@df234987是的,您需要手动更改
WM\DPICHANGED
消息中对话框的大小。您是如何做到的(所有内容,不存在位图)?似乎有人意识到了这个错误,并在Creators Update 1703中创建了PerMonitorV2,以解决对话框中的问题,但这使得Win8.1到Win10 1607无法使用PerMonitor。MS是否提供了一个可调用的函数,该函数将针对那些版本的windows进行扩展(当然作为源代码提供)?@df234987我已经在内部提交了请求,请参阅更新的答案以获得答复。问题是如何做。如何根据资源缩放完整的对话框?我想你应该把它加载到某个内存位置,解析一些结构树更新东西,但不确定。似乎对话应该自己做。我知道Win10中有一个线程级选项,但需要支持8.1。@df234987是的,您需要手动更改
WM\DPICHANGED
消息中对话框的大小。您是如何做到的(所有内容,不存在位图)?似乎有人意识到了这个错误,并在Creators Update 1703中创建了PerMonitorV2,以解决对话框中的问题,但这使得Win8.1到Win10 1607无法使用PerMonitor。MS是否提供了一个可供调用的函数,该函数将针对那些版本的windows进行扩展(当然作为源代码提供)?@df234987我已在内部提交了请求,请参阅更新后的答复。