Windows中的字体映射关系

从软件开发的角度,研究如何自定义Windows的系统字体。

在Windows程序开发中经常使用CreateFont创建指定的字体,其中一个参数"lpszFace"指定了字体名称。

那么系统是如何加载这个字体的?

首先会从注册表中查找:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

这里列出了系统中已经安装的字体信息,以及该字体对应的字体文件名(默认路径是C:\windows\fonts)。

如果找到了,则加载对应的字体到内存,用作文字输出。

如果没找到呢?

系统还会寻找:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes

这里定义的是复用字体,如果系统中没有安装指定的字体,但是可以在这里添加一个表项,指向系统中已有的字体。

如果还是没有找到呢?

那么CreateFont函数可能会返回失败,文字输出可能会使用一个叫做“System, 16”的字体代替。

在研究注册表的时候,还有一个表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink

这里定义的是字体链表,作用是当我加载的字体中没有要显示的文字的时候,就会从这里找到对应字体的备选字体文件。

从备选字体中加载要显示的文字。


所以如果要安全地去掉“微软雅黑”字体的方法就是:

  1. 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts中删除微软雅黑

  2. 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes中设置微软雅黑的别名

3.重启电脑

4.删除C:\Windows\Fonts\msyh.ttf