从资源中按比例缩放一个完整的对话框。

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

我在一个Win32应用程序中设置了每个显示器的DPI缩放,我的部分可以正常工作,然而打开在资源编辑器中创建的对话框并不能自行缩放(我认为使用对话框单位,可以)。

有没有一种方法可以将对话框资源中的所有内容进行缩放,并且兼容,比如Win8.1,以及Win10,甚至Win7?

winapi dialog controls dpi
1个回答
0
投票

Per-Monitor和Per-Monitor(V2)DPI意识。

建议更新桌面应用程序,使其使用每台显示器的DPI意识模式,使其在DPI变化时能立即正确渲染。当应用程序向Windows报告它要在这种模式下运行时,当DPI变化时,Windows不会对应用程序进行位图拉伸,而是向应用程序窗口发送WM_DPICHANGED。 然后,应用程序完全有责任为新的DPI调整自己的大小。大多数桌面应用程序使用的UI框架(Windows通用控件(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和更老版本的Window 10上不能,必须手动完成。 Windows 8.1和旧版Windows 10,我们不缩放控件。 所以解决方案应该是调整对话框的大小即可。 如果对话框不能调整大小,它必须枚举所有控件并在WM_DPICHANGED期间调整它们的大小。

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