处理Windows 10中DPI(文本大小)的运行时更改

10
在Windows 10上,系统不再需要重新启动(注销/登录)即可更改DPI(文本大小)。
我的应用程序还没有准备好进行此类运行时更改。
系统如何通知应用程序DPI正在更改?我应该处理哪个消息?
< p >我正在使用C++ Builder,因此我正在寻找纯WinAPI解决方案,没有WinForms。

2个回答

10

正如@TLama和@DalijaPrasnikar评论的那样,需要处理的消息是WM_DPICHANGED

#define WM_DPICHANGED       0x02E0

自 Windows 8.1 起,当窗口被移动到另一个 DPI 不同的监视器时,该消息就可用了。

在 Windows 10 上,DPI 的运行时更改从 API 的角度来看,与将窗口移动到 DPI 不同的另一个监视器相同(当然,在这种情况下,窗口仍留在同一个监视器上)。

即使在 Windows 10 上进行运行时 DPI 更改,应用程序也需要声明支持每个监视器的 DPI 才能接收消息。首选方法是通过在应用程序清单中将 dpiAwareness 设置为 PerMonitorV2(并设置附加的 PerMonitor 值,并将 dpiAware 设置为 True/PM 以兼容旧的 Windows 10 构建和 Windows 8.1),在应用程序清单中声明支持

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    ...
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>
当应用程序声明支持每个监视器的 DPI 时,系统不会在 DPI 运行时更改像素精度地缩放其窗口。这时应用程序需要自己本地缩放其窗口。

当应用程序声明支持每个监视器的 DPI 时,系统不会在 DPI 运行时更改像素精度地缩放其窗口。这时应用程序需要自己本地缩放其窗口。


3

从C++ Builder 10.3开始,您可以使用以下表单事件:

  • OnAfterMonitorDpiChanged - 在监视器DPI更改之后触发
  • OnBeforeMonitorDpiChanged - 在监视器DPI更改之前触发

当然,在项目设置的应用程序清单中还需将DPI Awareness设置为PerMonitorV2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接