问题起源是使用 gdi++。总的来说这个东东被国人发展到现在,效果真的不错。可是它不适合渲染作为界面字体的中易宋体,因为这个字体的笔画实在太细,英文字体还是实在是不怎么好看的等宽字体,看起来眼睛负担比较大。但这并不是 gdi++ 或者中易宋体的问题,只能怪 Windows 自身。写这篇文章主要是抱怨 Windows 可悲的历史积淀,宣泄我的无力感。
Windows 系统中很多地方,比如各个属性对话框、任务管理器,以及广大的英文版软件,那儿的字体不能在个性化里头修改,姑且认为系统在这些地方使用了所谓的默认字体。但不知道为何在满眼雅黑的 Win7 时代,中文版系统的默认字体居然还是中易宋体,gdi++ 渲染起来很悲剧。为了美观,很多人选择替换掉中易宋体的字体文件。不过我觉得这个方法很不优雅,原因有二:一是更改了字体文件,在真的要使用中易宋体的时候(比如文档打印)将无法正确渲染。二是宋体作为中文的衬线字体,有着独特的美感,直接替掉字体,在适合显示宋体的地方变成其他字体(比如各种黑体),可能会破坏美感,很鲁莽。理想的办法是保留这个字体,只是把系统默认字体设置成其他字体。
可这谈何容易?在注册表里摸索了半天,字体链接、字体替换,语言包,controlset里字体那块儿,凡是搜到有“simsun”和“宋体”的地方,只要看上去和默认字体相关的我都改过,但都不起作用。所以现在折中的做法是直接排除 gdi++ 对 Office 等需要使用宋体的软件的渲染,然后给宋体进行热替换。替换字体是 Office 自带的华文中宋,要粗一些,看起来不那么费劲,而且其中的英文字体是非等宽的,所以英文版软件看上去正常多了,不会有字符显示不全的问题。不过问题是不少对话框体积都被撑大了,有些不爽。希望能找到一款字符较粗但又不会撑开对话框的宋体来进行替换。
虽然这样效果看上去还可以,但在始终觉得不满意。调研再三终于发现了问题所在,但是却大失所望。原来中文版的 Win7 很多地方的字体与个性化里的设置、与注册表里的设置都没有关系,都直接被设定成了宋体。这些设置写在语言包内,一般是扩展名为 mui 的资源文件,不同的界面语言的 mui 内设置不一样,修改时需要专门的工具。mui 文件数量庞大让人大跌眼镜,原来个性化里头只能改很少一部分的界面字体,真不知道是不是该说 Windows 骗人…
前文说的默认字体到中文版的 Win7 这儿居然只是软件工程师脑袋里头的一个概念。他们想既然中国人很喜欢宋体,那就把宋体作为默认字体吧,于是就在每个对话框的字体设置那里写下了“宋体”两个字。解决方法找到了,但是逐一修改每个程序的每个对话框的字体显然是件很痛苦的事情,而且 Win7 还有各种权限限制,更换一下改过的 mui 文件也很麻烦。对话框结构还是用单一字体来优化的,所以自己改来改去,效果总是不如原生的好。尝试了半天只能放弃了,继续用前面那个折中的方法。
在注册表中有一个对叫做“MS Shell Dlg”虚拟字体,该字体在英文版的 mui 里头广泛使用,只需要修改这个虚拟字体指代的实际字体,就能很方便的更改 Windows 系统本身几乎所有地方的字体。但是在中、日文语言包内 MS Shell Dlg 却被替换成了实际字体,真不知道该怎么形容这个事情(不认识韩文,所以没装韩文语言包,是不是也被替换了就不得而知了)。替换成实际字体也就罢了,可是既然已经进化到了黑体时代,那中文版的也该像日文版那样改成黑体的啊,干嘛还死死抱住宋体不放?太让人发指了!只能期待下个版本的 Windows 设计的时候工程师们能想想宋体以外的字体,把字体这块儿好好的重做一下。
附上我曾经修改过的注册表项。
[HKEY_CLASSES_ROOT\Mime\Database\Codepage\936] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack\SurrogateFallback] [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\FontAssoc\Associated DefaultFonts] [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\FontAssoc\Associated DefaultFonts] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FontAssoc\Associated DefaultFonts]
ps. 后来找到了视觉效果更好些的方正雅宋字体,和雅黑一样带个“雅”字,都有那么些扁扁的感觉,挺配的,就一直用这个来热替换宋体了。制作的混合替换字体显示效果见:看上去不错的屏幕宋体第二弹、第三弹和第四弹。
ps. 撑大对话框的问题解决了,是字体内设置的问题,参见:看上去不错的屏幕宋体。