本文将介绍 Windows 系统中高 DPI 开发的基础知识。由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中;所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容,以免不断踩坑。
本文内容
各种不同的 Windows 桌面 UI 框架
微软主推的 Windows 桌面 UI 框架有:
- UWP
- WPF
- Windows Forms
- Win32 与 C++
- DirectX
后两者实际上并不是 UI 框架,是 UI 框架的底层不同实现。当然你单纯凭借 Win32 和 DirectX 去开发 GUI 应用也没有人拦你,只不过如果你试图只用 Win32 和 DirectX 而不进行各种 UI 组件封装的话,最终会非常痛苦的。
UWP 只支持 Windows 10(当然也分不同的小版本,兼容起来有些痛苦)。
WPF 和 Windows Forms 的最新版本只支持 Windows 7 SP1 及以上系统。如果要支持 Windows 7 和更早的系统,你需要降低 .NET Framework 的版本至 4.6.2 及以下;如果要 XP 支持,还需要到 4.0 及以下。
对普通用户而言的 DPI 级别
DPI 值有两种:系统 DPI (System DPI) 和屏幕 DPI (Monitor DPI)。自 Windows Vista 开始引入系统 DPI 概念,自 Windows 8.1 开始引入屏幕 DPI 概念。
在 Windows Vista / 7 / 8 中,操作系统提供了真正的 DPI 的设置:
▲ Windows 7 的 DPI 设置(控制面板 -> 外观与个性化 -> 显示)
这里的设置改的就是系统的 DPI 值。
Windows 7 中还额外提供了传统 Windows XP 风格 DPI 缩放比例的选项(此选项在 Windows 8 之后就删掉了),这也是在修改 DPI 值,只不过可以选择非 1/4 整数倍的 DPI 值。
▲ 自定义 DPI 设置
自 Windows 8.1 开始,操作系统开始可以设置不同屏幕的 DPI 值了:
▲ Windows 10 中的多个屏幕选择<