·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> VB汉化 >> 再论 VB 程序字体字号的修改    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

再论 VB 程序字体字号的修改

作者: 梁利峰 来源:点睛工作室 时间:2003-08-02 点击:10793


再论 VB 程序字体字号的修改


声明

个人可以自由转载本文,不过应保持原文的完整性,并通知我;商业转载先请和我联系。

本文没有任何明确或不明确地提示说本文完全正确,阅读和使用本文的内容是您自己的选择,本人不负任何责任。

如果您发现本文有错漏的地方,请您给我指出;如果有什么不理解的,请您给我提出。

意见、建议和提出的问题最好写在我的主页 http://llf.126.com 的留言版上。

延续的战争

这两天,又继续研究了一下 VB 可执行文件中的字体块的结构,现在基本上可以确定,字体块是由字体名和它前面的十二个字节所组成,本文主要介绍结果,具体过程略去,如对过程有兴趣,可以和我联系。

本文有与之配合的例子程序,在这个例子程序中,包含了全部有“Font”属性的非 ActiveX 控件,同时,这个例子程序使用了我所有的英文字体,在阅读完本文之后,应该看一下这个例子,并且亲自修改一下试试。

字体块的研究

第一个字节表示此字体块所属的控件类型,已知的控件类型如下(其中的数字均为十六进制):

	Frame   = 1B
	Option  = 1D
	Command = 1D
	Drive   = 1E
	Dir     = 1F
	Check   = 20
	Data    = 21
	Label   = 25
	Combo   = 26
	List    = 27
	File    = 29
	Text    = 2E
	Picture = 39
	Form    = 40

第二个字节的意义未知,在现在所能找到的字体块中它的值均为“01”,也可能是和第一个字节共同构成一个双字节整数。

第三个字节代表“语系”,也就是“Charset”,英文为“00”,简体中文为“86”。

第四个字节的意义未知,在现在所能找到的字体块中它的值均为“00”,不过应该和上一个字节没有关系,可能是保留区。

第五个字节是标志字节,用来指示字体的风格,分别是“斜体”、“下划线”、“删除线”,其中“斜体=02”,“下划线=04”,“删除线=08”,可以复选,比如要同时有“删除线”和“下划线”,则此字节为“08+04=0C”。

第六、七这两个字节共同组成一个双字节整数,表示字体的“粗体因素”(Weight),一般的值为 400 或 700 ,分别表示正常和粗体,但是在字体“Bookman Old Style”中也有可能是 300 ,所以这两个字节的值是“90 01”(400),“BC 02”(700)或“2C 01”(300)。关于“粗体因素”,VB 的帮助里是这么说的:

    返回或设置组成 Font 对象的字符的权重。权重指的是字符的宽度,或“粗体因素”。值越大,字符越粗。

    Font 对象在设计时不能直接使用。取而代之的是,在“属性”窗口中通过选择控件的 Font 属性并单击“属性”按钮来设置 Weight 属性。可以通过从“字体”对话框的“字形”框中选择一个项来隐含地设置 Weight 属性。正常和斜体设置值的 Weight 值是 400(缺省值),而粗体和斜粗体设置值的 Weight 值是 700。然而在运行时,通过为 Font 对象指定 Weight 属性值可直接设置 Weight。

    如果在运行时将 Font 对象的 Weight 设置为不同于 400 或 700 的值, 那么 Visual Basic 将把这个值转换为 400 或 700,这取决于哪个值与设置的值更接近。精确的范围为:Weight > 400 并且 < 551 则转换为 400;Weight > 550 则转换为 700。

第八、九、十、十一字节共同组成一个四字节整数,表示字体的大小,它的值是具体设置的 10000 倍,比如 9 ,在这里就是 90000 ,相应的这四个字节就是“90 5F 01 00”。

第十二个字节表示字体名的长度,比如字体名是“Courier New”,则此字节就是“0B”。由此也可以知道,字体名不能长于 255 个字节。

后面所有的字节是字体名。

字体块的修改

通过以上的介绍应该对字体块的修改有一个大致的了解了,我说一下具体的问题。

在汉化中,第三个字节是需要修改的,把原来的“00”改成“86”,另外字体大小是需要修改的,一般是把“80 38 01 00”(8)改为“90 5F 01 00”(9),字体名可以不修改,不过对于“Fixedsys”、“System”或者中文字体来说,如果希望显示为“宋体”,就需要修改字体名,不过因为字体块和其它部分共同构成了窗体的结构,所以不适合于修改字体名的长度,可以把原字体名改成一个不存在的字体名,这样,系统会自动使用“宋体”来显示(事实上是使用缺省字体来显示),可以把字体名的所有字节都改成空格,这样可以保证不会重名。其它的字节,不止不需要修改,而且不应该修改,慎之!

限制

修改字体块确实可以改变字体,不过有些情况就无效了。

首先,如果可执行文件中没有字体块,这种方法就不适用了;另外,如果是主窗体中的一个控件有字体块,而主窗体没有字体块的话,则只能修改那一个控件的字体。

还有,如果程序是在运行时动态地修改字体,这种方法也不适用。

最后,可能是因为英文版的原因吧,像 Vopt99 这样的程序虽然窗体没有字体块,但是显示的字体大小却是 8 (本来应该是 9 的),这种情况目前也没有办法。

(修改 Vopt99 的字体块后,Splash 窗体的字体正常;主窗体下方的磁盘文件分布图字体正常;上排第三个图框的字体可以修改,不过显示有重影,尽量不要修改;上排第四个图框上方的 Label 的字体正常;其它的部分的字体都不正常。有两种可能,一是因为它在运行时动态地修改字体,二是因为某处有英文版的标记,我倾向于认为是第二种情况)

展望

经过几天的考虑,我觉得字体块和其它的部分一起组成了窗体块,而这个窗体块和 Delphi 的 RCDATA 是类似的,也就是说,如果我们可以知道窗体块每一部分的含义,则可以像现在修改 Delphi 的资源一样的修改 VB 的资源,不过目前考虑,即使清楚的知道了窗体块的含义,一样有一个限制,这就是修改后的窗体块的大小需要小于原窗体块,这一点上,VB 资源的编辑不会有 Delphi 那样使用 Windows 资源格式的灵活性,除此之外,应该是都相同的。

点睛工作室·梁利锋 结稿于 2000.5.18(19日修正)

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): 字体 VB

·上一篇: ASCII资源的汉化(3) ·下一篇: 还是字体块--VB 程序字体字号修改之三

· 版权申明: 本文引自《点睛工作室》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《点睛工作室》[ 作者: 梁利峰],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号