winapi - 在支持 Windows 8.1 的应用程序上缩放非客户区以支持每个监视器的高 DPI

标签 winapi windows-8.1 dpi highdpi

我正在开发一个在 Windows 10 和 8.1 上运行的应用程序,并且遇到了在具有不同 DPI 的显示器之间移动时缩放非客户区(菜单栏、标题栏)的问题。客户区已处理,但非客户区超出比例。 DPI 感知设置为 PerMonitorAware(v1,因为 v2 在 Windows 8.1 上不可用)。

函数 EnableNonClientDpiScaling 完全满足我的需要(这是对所有类似问题的公认答案)- 唉,它只是 Windows 10 中 API 的一部分。

有没有办法在没有前面提到的功能的情况下手动处理此问题 - 以保持对 Windows 8.1 的支持?或者支持 Windows 8.1 是否意味着在具有不同 DPI 的屏幕之间移动时无法调整非客户区的大小?

最佳答案

DPI 支持是一个不断变化的目标,您只需决定支持的最低平台是什么,并接受多显示器缩放在这些旧平台上并不完美。

在可用的版本上调用 EnableNonClientDpiScaling(GetProcAddress 或您使用的任何语言的等效项)。

新的感知 list 元素在 Windows 10 中的工作方式意味着您可以在支持它的地方使用 Per-Monitor v2(1703 及更高版本),在旧版本上可以使用 PMv1、系统或 Unaware。 PMv2 使您可以自动缩放基于 DialogBox 的对话框。

关于winapi - 在支持 Windows 8.1 的应用程序上缩放非客户区以支持每个监视器的高 DPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54110319/

相关文章:

c++ - MediaFoundation HEVC H265 编码

c++ - 使用 WinAPI 附加禁用的显示设备

winapi - 匿名管道上的重叠 I/O

c++ - Visual Studio 2013 中的 msvcr120.dll 和 msvcr120_app.dll 有什么区别?

javascript - 完全关闭我自己在 Windows Phone 8.1 和 Windows 8.1 上开发的应用程序

c# - 在 Windows 应用商店应用程序 (Windows 8.1) 中使用 GeoLocator 时出现 "The pipe is being closed"错误?

c# - 从控制句柄获取进程

android - 有关 Android 可绘制文件夹的问题

css - Chrome block 元素与 Windows DPI 缩放有奇怪的边框

delphi - Delphi Seattle 中运行时 DPI 更改后如何处理菜单缩放