设想一个情景,hillin想在自己的710+中安装又小又好看的SofiaSans字体。通过这个情景,让我们来看看在WM系统中修改字体到底是怎么一回事。
1 复制字体文件到系统
情景1.0:复制字体文件sofiasans.ttf到\Windows下,如果剩余空间足够大,就可以成功复制。
情景1.1:hillin的手机刷的是SofiaROM。SofiaROM从定制时就以SofiaSans作为默认字体,但是版本比较低,hillin想升级它。这时候,hillin复制到sofiasans.ttf到\Windows下,出现覆盖文件的提示。选择覆盖文件之后,成功复制文件。
情景1.2:SofiaSans又更新了,hillin再次按情景1.1的方式复制文件,但是系统提示文件正在使用,无法覆盖。
这里我们就要考虑WinCE特殊的文件管理机制。对于刷到ROM中的文件,可以使用一个新的同名文件将其覆盖。覆盖时不会删除ROM中的文件,而是用某种 方式隐藏了它,以后每次当调用这个文件时,都会调用覆盖后的新文件。但是需要注意到是,旧文件依然存在。因此即使执行了覆盖操作,即使你看不见旧文件了, 旧文件依然占据它所占有的空间。


而对于并非处于ROM中的文件,则是另一套运作方式。覆盖操作会删除旧文件,然后写入新文件。这样旧文件将彻底不复存在,也就不会占据额外的空间了。
但是,区别于我们见过的几乎所有操作系统,WinCE有一个奇怪的特性,就是即使一个文件正在使用,我们也可以修改它的文件名。这为解决情景1.2中 hillin遇到的麻烦提供了一个机会。系统中原有的Sofiasans.ttf文件正在使用,所以hillin将其改名为Sofiasans.xxx。 这样,系统中正在使用的文件变成了Sofiasans.xxx,他把新的Sofiasans.ttf复制进了系统。重新启动后,系统会调用 Sofiasans.ttf而非Sofiasans.xxx,因此可以将Sofiasans.xxx,也就是之前的Sofiasans.ttf删除。

2 修改FontLink
hillin查阅了很多关于修改WM字体的文章。这些文章都精确地指出,应该修改注册表来告诉系统应该使用什么字体。修改方法是这样的,找到一个注册表编 辑器,可以用在PC端执行的CE Registry Editor,也可以在手机端使用各种注册表编辑器,例如Resco Explorer就带有这样一个东西。在注册表编辑器中找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \FontLink\SystemLink,然后修改下面所有项的值为:

复制内容到剪贴板
代码:

字体文件路径,字体名

比如说hillin要修改字体为SofiaSans,字体文件路径无疑是\Windows\Sofiasans.ttf,而字体名则是SofiaSans。于是他把所有项都改成了:

复制内容到剪贴板
代码:

\Windows\Sofiasans.ttf,SofiaSans

然后重新启动手机。
情景2.0 hillin以前使用的ROM是SofiaROM,使用的是老版本的SofiaSans字体,注册表中的所有键值都是已经修改好的,因此他什么都不用做。重新启动后,他发现修改字体很成功,老版本字体中显示不正确的一些字都被纠正了。
情景2.1 hillin以前使用了一个使用宋体的ROM。复制完文件、改完注册表后,他发现,只有一部分字体变成了SofiaSans,而很多字体依然是宋体。
在WM系统中,FontLink并不是设置系统字体的唯一的地方。系统指定了一些默认字体,这些设置无视FontLink中的任何修改。它们位于注册表的四个不同位置,对应不同的用途:

复制内容到剪贴板
代码:

HKEY_LOCAL_MACHINE\SYSTEM\GDI\SysFnt:系统字体 HKEY_LOCAL_MACHINE\SYSTEM\GWE\Menu\BarFnt:菜单条字体 HKEY_LOCAL_MACHINE\SYSTEM\GWE\Menu\PopFnt:弹出菜单字体 HKEY_LOCAL_MACHINE\SYSTEM\GWE\OOMFnt:内存不足窗口字体

每一个键下面都有若干项,指定了这个键对应的用途所使用的字体规则,例如Ht、It、Wt之类。而我们最关心的则是一个叫Nm的项。这个项指定了字体的名称。
于是hillin兴高采烈地把这四个项下的Nm值都改成了SofiaSans。
情景2.3 hillin修改了上述键值后,终于把所有系统字体都改成了SofiaSans。
情景2.4 WM依然顽固,并不是所有字体都改过来了,宋体依然存在。
这是一个令人头疼的问题。 hillin分析了一下,可能是因为宋体之类的字体依然存在于系统中,系统会无条件地优先调用这些字体。他翻了翻\Windows文件夹,发现了两个可疑 文件:sunfon.ac3,大家都知道这是宋体的字体文件,以及nina.ttf,这应该是系统中的英文字体。但是这些文件位于ROM中,是无法删除 的。怎么办呢?hillin灵机一动,把sofiasans.ttf复制了两份,改名为sunfon.ac3和nina.ttf,覆盖了系统中原有的文 件。
情景2.5 覆盖文件后,hillin重新启动了手机。结果很多文字变成了框框。
看起来直接覆盖这两个文件是行不通的?事实是这样的:sunfon.ac3是一个特殊的Truetype字体文件(ttf文件)。它包含了字模信息,但是 不包含字体名称之类的信息。系统调用sunfon.ac3时只会读取其中的字模,而不管这是个什么字体,因此用sofiasans.ttf代替 sunfon.ac3是可行的。但是nina.ttf不一样。系统调用时,指名道姓要调用“nina”字体,而非“nina.ttf”这个文件。看,情况 就是这样。虽然nina.ttf被sofiasans.ttf代替了,但是系统无法从新的nina.ttf中找到nina这个字体。因此应该用这个字体显 示的地方都变成了框框。
情景2.6 好在hillin懂得一些字体制作的知识。他用字体编辑软件打开sofiasans.ttf,然后把字体名改成nina,得到一个改名为nina的SofiaSans字体,并且把这个字体替换掉原有的nina.ttf。终于,重新启动后,一切都表现正常了。
常用的字体编辑软件有Font Creator Program(FCP)、FontForge 等。FCP因本身的问题是无法编辑sofiasans.ttf的,而FontForge是一个UNIX软件,让它在Windows下运行不是一个简单的事 情。况且nina.ttf本身只包含英文字模信息,大小只有100来KB,用一个2M多的(如果本例中使用的是其他字体,还会更大)的Sofiasans 来代替它实在很划不来。因此,可以变通一下,使用其他字体来代替nina.ttf。例如本例中,Sofiasans.ttf的英文部分是Segoe Condensed,那么可以找来这个字体(segoe.ttf),修改字体名为nina后代替nina.ttf。
3 打开ClearType
ClearType可以平滑字体的边缘,使其显示更加美观。对于一些没有点阵字库的字体,不开启ClearType简直就是一场灾难,因为这些字体会显示得极其难看。
打开ClearType很简单,只要在HKEY_LOCAL_MACHINE\SYSTEM\GDI\下建立一个叫ClearType的值即可。如果你觉得不保险,还可以在这个键下建立一个叫ClearType的DWORD值,值为1。修改后重新启动即可。
4 修改FontAlias调整字体大小
很多人向hillin抱怨说SofiaSans太小了。这里太小了不是说字体文件太小了,而是文字的显示有点小。修改FontAlias可以解决这个问 题。按照MSDN的说法,FontAlias有两种用法:字体别名(Font name aliasing)和字体固定(Font fixing)。两种用法的玄机都存在于注册表项HKEY_LOCAL_MACHINE\System\GDI\FontAlias里。
第一种用法是给一个字体取一个别名。例如,我们想让应该显示Tahoma字体的地方显示为SofiaSans,那么只要在这个键下新建一个字符串值项取名 为Tahoma,值为SofiaSans。当然这一点FontLink已经替我们做过了,我们关心的是如何整体放大(或缩小)字体的大小,也就是第二种用 法。
例如,我们想让所有10pt(点)大小的SofiaSans字体都显示成14pt。那么新建一个字符串值:SofiaSans:-10,值为 SofiaSans:-14。不过hillin觉得SofiaSans的大小其实正好,所以如果你觉得这个大小让你不够舒服,就自己在这里摸索一下吧。

转载自IOICN

Last modification:February 10, 2020
If you think my article is useful to you, please feel free to appreciate