设想一个情景,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
9 comments
我将wm6.1(英文rom)的字体改为windows7的雅黑后,字体自然变大,影响了正常使用。不知道怎么才能改回来。
上述方法无效~~~
这个SofiaSans字体,XP下能用不?能用的话,发我一份
我没用这个字体,我喜欢雅黑
雅黑还好,但英文字,我还是喜欢apple那个,忘记名字了,汗~
为什么不用Ajax呢?才发现,不能修改评论,都害我发了3个了,:)
呵呵~~卧室故意不用那个插件的,我希望看到大家最原始的评论,因为很多人评论过后会有习惯去修改,有时候会改掉自己最初的想法~~呵呵
那些错了,岂不很尴尬……凡是有好的一面,亦有不良的一面,呵呵
用ALinux,挺好嘛
感谢了,没怎研究过WP的插件,呵呵