Windows 10 中的部分字体在高分屏下为什么会发虚?这是字体渲染的 bug 吗?
不是bug,是MMC有很多界面仍未针对高分屏进行显示优化,属于历史遗留问题。
MMC是Windows一个很老的组件了,最远可以追溯到Windows2000时代。我们常见的系统自带的管理界面(例如计算机管理、服务、组策略、任务计划等)都是基于MMC。实际上MMC组件自从2006年的Windows Vista开始就没再重构过,其架构一直用到现在。目前其版本号仍停留在3.0,本身一直没有针对高分屏优化。
Windows系统本身就有应用未适配高分屏的兼容性策略,若应用没有适配高分屏显示,系统会先以96 DPI(也就是默认的100%缩放)的比例去渲染,然后再将画面按照系统设定的缩放率缩放到常规大小,避免因界面显示过小导致无法看清其中的图形界面,就和查看图片的缩放效果一样,模糊是难以避免的。MMC一直到Win8.1都是未适配高分屏的模糊显示缩放状态,微软官方文档曾明确将mmc.exe及其插件归类为"无法感知DPI"(Unaware)的应用程序(Windows 8.1时代)。直到Win10推出了全新的字体渲染方式才有所改善,其中Win10针对传统Win32应用推出了一项新功能,在传统Win32应用设置兼容性为"系统(增强)",其本质上是通过系统底层劫持字体渲染调用,强制要求字体以目标缩放率进行渲染,从而使传统Win32应用的字体渲染效果也能获得高分屏的体验,MMC默认开启这个选项,这才使得基于MMC的工具在高分屏下字体可以显示得很清晰。
不过,即便是Win10新增了全新渲染,MMC对高分屏的适配仍然比较割裂,部分界面仍然是96 DPI的等比缩放,主要有以下原因:
1.MMC的界面内部其实并不是单一窗口,而是在一个主窗口里面嵌套了多个子窗口(句柄),例如组策略,说出来你可能不信,其菜单栏(可以算作是主窗口的一部分)、二级快捷菜单栏、下方的组策略主界面其实可以看作是三个窗口,其中后两者可以看作是主窗口下面的子窗口,只不过子窗口此时处于最大化状态,与主窗口完全融合了而已。

直接运行mmc命令,或者进入部分管理界面(例如组件服务(comexp.msc)),菜单栏的最右侧还会显示标准的窗口"三大金刚键",点击"还原"可以发现其在内部真的成了独立的子窗口,只不过标题栏此时并没有使用DWM渲染,所以会显示成Win7 basic的传统样式。


如果使用过Office2010或更早的版本,应该对于这种嵌套窗口界面非常熟悉。子窗口的界面风格、渲染、框架等未必继承主窗口,所以不同界面的渲染效果也会有所不同。
2.其次,MMC窗口内嵌套的子窗口并非全部使用Win32API进行开发。前面已经提到Win10及以上的字体缩放优化仅针对win32api,且MMC的界面并未适配高分屏,所以部分非标准win32api的界面就会出现字体渲染模糊的情况。MMC窗口中使用了多种不同的api,包括但不限于标准Win32 GDI、MFC、ActiveX、WinForms、WPF等框架,这些框架对高分屏的支持本就不同,前面提到的字体渲染效果只支持老式纯GDI渲染界面,对于GDI+以及其他非标准GDI框架则无能为力。这就是为什么MMC中能同时出现渲染清晰和渲染不清晰的界面,本质上还是历史原因。