·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> Delphi汉化 >> Delphi 汉化中 PixelsPerInch 对界面效果的影响以及解决    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

Delphi 汉化中 PixelsPerInch 对界面效果的影响以及解决

作者: Bruce 来源:汉化教学 时间:2003-08-06 点击:13269

Delphi 汉化中 PixelsPerInch 对界面效果的影响以及解决

Bruce

提出问题
(此段文字受到大家批评,既然我的本意是尽量源创,所以还是保留,希望不喜欢的人只当是我的“窃以为”,不要太过叫真,看看而已)汉化技术从关子将它引入简体中文世界到现在也不知多少年头了,随着汉化工具和汉化技术的发展,汉化变得简单起来,汉化队伍空前的膨胀,但是这些汉化还是以 MS VC++ 的汉化为主,因为以 Visual Localize 3.0 为代表的软件几乎把 C++ 程序的汉化带到了会英文就会汉化的地步。但是网络上的好东西不只 VC++ 是好东西,还有许多别的宝藏。Delphi 打着“聪明人编程用 Delphi”的旗帜声势浩大的走来,Delphi 编写的软件体积小,不需运行库,得到越来越多人的喜欢。但是 Delphi 的汉化技术好像一直就没有进步过,无论是国外国内,都没有可视的资源修改工具。自从有了 Formread ,这种现象才得到了稍微的缓解。但是这个工具也只是提供了效果预览,还不支持资源回写,实在是不令人乐观。最近我对 Delphi 的汉化产生了兴趣,试着做了点东西,其间遇到了无数问题,经过参看 BruceZ 和 LLF 等朋友的文章,再加上无数次的试验,现将我的经验告诉大家。
所需工具
eXescope 6.1 用于导入导出 dfm 文件,formread 2.5 用于编辑修改预览 dfm。
简明步骤
使用 eXescope 打开可执行文件,在 RCDate 栏,导出一个以脚本形式存在的 dfm ,显示乱码的不要管他,不必关闭 eXescope。运行 formread 找到导出的 dfm 文件修改字符集,字体字号和英文字串,保存,选择 eXescope 导入修改后的 dfm 替换英文版的。优缺点:eXescope 导出的是真正的 dfm 文件,而不像 Reshacker 导出的是一个文本文件:(,但是如果你不选用导入功能而是和 BruceZ 说的粘贴回去,经常会出现断句的现象。formread 可读取 .exe .dfm .txt 文件,但在 2000 下无法打开.exe文件,并且无法保存修改结果,.txt 无法彩色显示脚本,修改时非常累眼。自然 .dfm 最好了。请老老实实的使用“代码编辑区”手工修改相关资源,字符串编辑区回写时老是破坏脚本。
范例实践
object AboutComponent: TAboutComponent
  Left = 285
  Top = 184
  BorderIcons = [biSystemMenu]
  BorderStyle = bsDialog
  Caption = 'About...'
  ClientHeight = 142
  ClientWidth = 345
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Position = poScreenCenter
  OnCreate = FormCreate
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 7
    Top = 8
    Width = 134
    Height = 22
    Caption = 'TSyntaxMemo'
    Font.Color = clBlack
    Font.Height = -19
    Font.Name = 'Arial'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object Label2: TLabel
    Left = 151
    Top = 14
    Width = 122
    Height = 13
    Caption = '(c) 1997 - 99 David Brock'
  end
  object Button1: TButton
    Left = 256
    Top = 104
    Width = 75
    Height = 25
    Caption = 'OK'
    ModalResult = 1
    TabOrder = 0
  end
end
这是一个最标准最好汉化的 dfm ,只需依次将上面绿色部分修改为'关于...';'GB2312_CHARSET';''-12';'宋体';'12';等等就可以完成汉化,预览一下,你会发现界面已经变成简体宋体 9 点字的界面。如果你还想调整一下控件的位置,还可以调整一下黄色部分。但是我建议你最好不要修改,因为 Delphi 可以使用第三方控件,而这些东西在 formread 里是显示不出来的,修改工作将是一件非常痛苦的事情,好的办法是调节一下自己的语言风格,让长度尽量贴近原文。这是比较简单易行的办法。其实这些内容也不算什么新鲜东西了,在好多汉化人的文章中都做过介绍,讲的比我还详细。大家可到【汉化新世纪】查找相关文章,我让大家注意一下例子中红色的部分,这才是我要讲的重点部分。
重中之重
大家再看下段例子
object ConfigForm: TConfigForm
  Left = 133
  Top = 50
  BorderIcons = [biSystemMenu]
  BorderStyle = bsDialog
  Caption = 'Setup Xnews'
  ClientHeight = 462
  ClientWidth = 612
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clBtnText
  Font.Height = -13
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnClose = FormClose
  OnCloseQuery = FormCloseQuery
  OnShow = FormShow
  PixelsPerInch = 120
  TextHeight = 16
  object Label20: TLabel
    Left = 25
    Top = 424
    Width = 260
    Height = 32
    Caption = 
      'Note: Some changes will not take place until'#13#10'the next time the ' +
      'affected window is opened'
  end
  
大家看看红色的部分,的一段例子是非常标准的 delphi 格式,第二段则是从 Xnews 中提取的一段代码,作者使用了非标准的象素每英寸值。在汉化过程中我采用了常规的方法,但问题来了。无论是预览还是导入实时运行,窗体都变的非常的小,文字也扭曲的和蚊子一样难看,我曾经一度以为是作者采用了第三方的 VCL 文件,按照 LLF 的方法追踪,修改,可是并没有变化。这个问题困扰了我非常长一段时间,某天再次阅读 LLF 的文章看到了他讲到 TextHeight 值的设置对字体显示的影响,我的脑子里顿时一亮,想到了可能作者设置的象素值对文字的显示产生了影响,说干就干,立即将 120 改为 96,呵呵果然字体变成了宋体9点字的显示效果,但是......
新的问题又来了,原来很小的窗体变的非常大,可能使用高分辨率的朋友感觉还不是太大,但是对800*600的朋友影响就已经很大了,我曾经尝试修改所有控件的位置长宽。上面也讲过这真是一种痛苦的工作,费了好多天的时间以后,发现几乎是完全失败的。从此汉化工作又进入了一个僵持期。
因为我总是不理解既然在 DEFAULT_CHARSET 下 Font.Height = -13 Font.Name = 'MS Sans Serif' 的字体下可以显示正常那么为什么改成中文后字号没有多大变化,显示效果就会有这么大反差那。
天天想天天头疼,突然有一天我想到,Delphi 对中文的支持会不会只是将它当作 图象来处理那,马上动手修改 96/12=8 那么 120/8=15 将 Font.Height 改为 -15, TextHeight 改为 15,预览,Yeah~漂亮的中文界面又回来了。
题外的话
我不从事 C 和 Delphi 的开发工作,所以对一些概念非常模糊,搞点汉化也纯粹是为了自娱自乐。所以对某些东西也不求甚解,比如在 C 下,英文界面最好看应该是 MS Sans Serif,8点字 最好看,而中文则是 宋体,9点字,宋体显然比 MS Sans Serif 大一点;但是到了 Delphi 则成了英文界面 MS Sans Serif,-13 ,中文界面 宋体,-12 按照上面的逻辑是不是应该认为 -XX字号越小那么字体就应该越大,但是我举的第二个例子证实了这个想法又是错误的。不知道谁能给我解释一下?谢谢

十分感谢 Ronnier 的回答:您写的很好啊。对于 TextHeight 和 Font.Height 的关系,我都没有注意过,不过就经验来说,只要记住,对于有 ParentFont = False 的,使 Font.Height 等于负的 TextHeight 就行了,而对于没有 ParentFont = False 的,使 Font.Height 等于负的 (TextHeight-1)。其实 -12 就是代表 12px,-13 代表 13px,至于为什么要用负的,微软有规定如下:
font_height: This value is the height of the font in pixels. If this number is negative, the font mapper picks a font with characters with height approximately the absolute value of this number. If it's positive, the font mapper picks a font with a character cell height equal to the height value. The cell height includes some blank internal leading space (more about this later), so this makes the characters a little bit smaller. 所以说用正的也可以,但是按微软的解释,字会稍稍变小。这是规定,就不必深究了。:-)
一点牢骚
此段文字有人身攻击嫌疑,接受伟兄建议,去掉了。我争取做到以后只谈技术,少说无聊的话。
真正的原因(附录)
自己只是在瞎琢磨,今天汉化新世纪的伟兄给我摘录了梁利峰兄的一段旧文字,解决了心中的疑虑,惭愧惭愧,还是看书不专。现转贴如下:
因为 Windows 其实不知道我们的显示器的大小,所以是通过我们的设置来标示英寸的大小的。好的,我们再来看一下 Windows 中关于字号的设置。 在显示属性对话框里可以设置字体的大小,不过只有两种设置,一种是小字体,另一种是大字体。其中小字体表示 96dpi ,而大字体表示 120dpi 。小字体是缺省选项,而大字体是在用户所选的屏幕分辨率太大(如 1600x1200)时,为了避免字体太小看不清楚而选择使用的。另外,用户也可以自己设置字体的分辨率,不过值就不一定是多少了。
我们常说的“宋体,9”,表示的单位其实是磅,也就是 9 磅的宋体。
我们来换算一下。在小字体的时候,分辨率是 96dpi ,也就是说一英寸能显示 96 个像素;9 磅是 1/8 英寸,所以 96/8=12 像素。也就是说,我们通常见到的字体就是这种 12x12 点阵的字体了。
另外,在大字体的时候,分辨率是 120dpi ,9 磅是 1/8 英寸,所以 120/8=15 ,就是说大字体时,显示的 9 磅字体其实是 15x15 点阵的字体。 在 VB、VC 或 Delphi 里,对于窗体设置字体后,窗体的大小会自动随用户所选择的是大字体还是小字体而自动调整窗体的大小,这一点就是因为它们使用了逻辑单位。缺省情况下,对于 VB 来说是缇,对于 VC 和 Delphi 来说是磅。

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

·上一篇: 再战非标准字体块-让 File Shredder 3.3 完美显示中文 ·下一篇: 还我庐山真面目

· 版权申明: 本文引自《汉化教学》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化教学》[ 作者: Bruce],如需转载请直接联系原始作者,并请注明原始出处。

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

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