Delphi 字体修改一例 (转)[@more@]Delphi 字体修改一例

声明

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

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

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

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

前言

汉化人大宇在汉化 CTris2000 这个 Delphi 程序的时候,修改了所有 RCData 中的字体设置,但仍然有一个窗体的字体很难看,我帮他做了修改,在这里就以它为例说一下 Delphi 程序字体字号的修改。

本来,我以为要详细的说才能说清,不过现在看来,也未必,所以在这里还是简单的说一下算了。

Delphi 程序的字体

关于 Delphi 程序的字体,以我想大概有三种情况:

一、RCData 格式。这种格式的字体字号的问题有很多工具,诸如 eXeSCOpe 、Reshacker 等工具都可以非常方便的修改,而且这也是 Delphi 程序中的字体设置使用最多的方法,而且大多数 Delphi 程序都只使用这一种方式,而其修改方法相对成熟的多,所以我不讨论这种方式。

二、SDK 格式。有些 Delphi 程序为了追求最小的独立可执行文件尺寸,不使用 Delphi 缺省的 VCL 运行库,而是自行使用 SDK 的编程方式,不过这种程序不多,如果有,个头也很小,一般是几K、十几K的居多,如果在这些程序里出现字体不协调的问题,可以使用和修改 C 字体字号相同的方法修改。

三、VCL 内部格式。VCL 是 Delphi 使用的函数库,其内部很可能使用了不是我们所希望的“宋体,9”的窗体,不过我想来想去,也只有类似 vb 函数的 InputBox 有这种可能,也就是 CTris2000 中要求输入姓名的那个窗体,故我们要谈的就是这种方式的程序的字体的修改,而且,几乎可以确定的固定在 InputBox 上,当然,即使是这一种情况,也比较类似 C 字体的修改,而不是 VB 。(我不知道 Delphi 中相同功能的函数的函数名,所以暂称其为 InputBox)。

修改过程

我修改的过程比较繁琐,所以在这里剔除复杂的部分,简单的说。

首先,使用 W32dasm 反汇编汉化后的 CTris2000.exe ,存盘,打开 CTris2000.alf 文件,查找 CreateFont ,发现只有 CreateFontIndirectA ,而没有 CreateFontA ,这真是一个烦人的开始。继续查找,发现 CreateFontIndirectA 被三个地方调用,地址分别是 4124EC 、420460 和 42A7F3 。

运行 Trw2000 ,调入 CTris2000.exe ,然后键入“bpx 4124EC”、“bpx 420460” 和 “bpx 42A7F3”设置断点,按“F5”运行,中断时键入“dd *esp”查看堆栈的栈顶指针所指的地址的内容,发现大多数情况此地址的开头都是“FFFFFFF4”,也就是“-12”,是正常的,不过有一次,它是“FFFFFFF5”,也就是“-11”,在它下面一点,我们见到了这种字体的名称“MS Sans Serif”。

用 ResHacker 检查 CTris2000.exe ,发现并不是所有的“MS Sans Serif,8”都被改成了“宋体,9”,所以首先把这些没有改成“宋体,9”的项都改成“宋体,9”,存盘。

用 UEdit 打开 CTris2000.exe ,查找“MS Sans Serif”,只有一个,在 0x5b0b8 处,为了验证,把这个“MS Sans Serif”改成“System”,运行程序,发现那个输入窗体的字体确实如我们所想的变成“宋体,12”了。

0x5b0b8 在数据段,所以,数据基偏移 = 基地址 + 数据RVA - 数据Offset = 400000h + 5c000h - 5ae00 = 401200h ,所以,0x5b0b8 的在代码中为 401200h + 5b0b8 = 45C2B8h 。在 CTris2000.alf 查找“0045C2B8”,没找到,那么,查找“0045C2B”吧,找到几处,如“0045C2B7”、“0045C2B6”和“0045C2B0”,很是奇怪。

运行 Trw2000 ,调入 CTris2000.exe ,像上面一样设断点,运行到有问题的 CreateFontA 的时候,键入“dd 0045C2B0”,看看是什么?原来是“FFFFFFF5”!好吧,把“0045C2B0”当作突破口。

打开 CTris2000.alf ,查找“0045C2B0”,发现两个地方,代码如下:

* Referenced by a CALL at Address: |:0041979B | :00419604 53 push ebx :00419605 56 push esi :00419606 57 push edi :00419607 6A48 push 00000048 :00419609 A1D0E54500 mov eax, dword ptr [0045E5D0] :0041960E 50 push eax :0041960F 6A08 push 00000008 * Reference To: kernel32.MulDiv, Ord:0000h | :00419611 E836BEFEFF Call 0040544C :00419616 F7D8 neg eax :00419618 A3B0C24500 mov dword ptr [0045C2B0], eax :0041961D A13CD64500 mov eax, dword ptr [0045D63C] :00419622 80780800 cmp byte ptr [eax+08], 00 :00419626 743A je 00419662 :00419628 E893FFFFFF call 004195C0 :0041962D 8BD8 mov ebx, eax :0041962F 8BC3 mov eax, ebx :00419631 2C80 sub al, 80 :00419633 752D jne 00419662 :00419635 BE68964100 mov esi, 00419668 :0041963A BFB7C24500 mov edi, 0045C2B7 :0041963F B904000000 mov ecx, 00000004 :00419644 F3 repz :00419645 A5 movsd :00419646 6A48 push 00000048 :00419648 A1D0E54500 mov eax, dword ptr [0045E5D0] :0041964D 50 push eax :0041964E 6A09 push 00000009 * Reference To: kernel32.MulDiv, Ord:0000h | :00419650 E8F7BDFEFF Call 0040544C :00419655 F7D8 neg eax :00419657 A3B0C24500 mov dword ptr [0045C2B0], eax :0041965C 881db6C24500 mov byte ptr [0045C2B6], bl * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00419626(C), :00419633(C) | :00419662 5F pop edi :00419663 5E pop esi :00419664 5B pop ebx :00419665 C3 ret

不知道大家是否能大概看懂上面的代码,不过它和我在《C 程序字号的修改》里摘抄的 MSDN 里建议的设置字号的方式是基本一样的:

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

我们可以看到,“0041960F”处的“6A08”压入的就是磅值,我们需要的是 9 磅的字体,所以把“6A08”改成“6A09”就可以了。代码基偏移 = 基地址 + 代码RVA - 代码Offset = 400000h + 1000h - 400h = 400c00h ,41960fh - 400c00h = 18a0fh ,也就是说“6a08”在 0x18a0f 处。

所以,最后的修改是这样的:把 0x5b0b8 处的 "MS Sans Serif" 改成 "宋体";把 0x18a0f 处的 6a08 改成 6a09 。

虽然我已经简化了过程,不过好像还是很麻烦,那么有没有什么简单的方法呢?有的。

一、如果实在不会这样的修改方法,也不要留着,把“MS Sans Serif”改成“System”是一种简单有效的方法,遗憾的是字体显得比较大。

二、先把“MS Sans Serif”改成“宋体”,然后用 W32dasm 反编译汉化后的程序并存盘后,用 EmEditor 打开 *.alf 文件,按“Ctrl+F”,出现查找对话框,选择“使用表达式”,在要查找的文本中输入“push 00000008nn* Reference To: kernel32.MulDiv,”,找到的不会很多,把“08”修改成“09”试一试,直到得到正确的结果。

需要注意,第二种方法只适用于 Delphi 程序的 InputBox 的字体修改,而第一种方法适用于所有程序。另外,我因为没有见到其它类似的 Delphi 程序,也不能肯定第二种方法就是对的,如果各位有见到,不妨一试。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988482/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-988482/

Delphi 字体修改一例 (转)相关推荐

  1. centos7默认字体_CentOS7终端的分辨率和字体修改

    本文转贴自https://blog.csdn.net/u010566813/article/details/40502819 一.修改分辨率 修改/boot/grub2/grub.cfg 添加如上,具 ...

  2. 字体修改的一些心得以及方法分享

    [字体教程]宁静之雨关于字体修改的一些心得以及方法分享[9/18更] http://bbs.dospy.com/thread-7213337-1-190-1.html 论坛上关于字体修改的教程不是很多 ...

  3. typora字体修改

    如何进行typora文本的字体修改呢?以下以github主题为例 1.文件>偏好设置-打开主题文件夹 2.备份github.css为github.css.bakup以防恢复原来的模式 3.打开g ...

  4. Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改、横坐标文字进行横/纵向显示、控制坐标轴范围等)之详细攻略

    Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改.横坐标文字进行横/纵向显示.控制坐标轴范围等)之详细攻略 目录 1.Matplotlib库图表绘制包 ...

  5. Delphi编程修改ProgressBar的颜色

    delphi编程修改ProgressBar的颜色 关键代码如下: uses CommCtrl; procedure TForm1.Button1Click(Sender: TObject); begi ...

  6. eclipse-阶段二-字体修改问题

    (1)打开eclipse,找到window (2)点击后在下拉菜单中找到preferences (3)在左边的菜单栏中找到general,appearance在general展开后的第一行,点击展开a ...

  7. Word字体修改(罚抄,抄作业专用)

    --Word VBA 脚本 罚抄专用 Sub 字体修改() ' ' 字体修改 宏 'Dim R_Character As RangeDim FontSize(5)' 字体大小在5个值之间进行波动,可以 ...

  8. IDEA中代码编辑器中字体修改

    代码字体修改 点击File菜单栏中的Settings选项 如图所示,可以改变代码字体样式,改变字体大小,也能调节代码行的间距.

  9. GitHub下载的 Git Shell中出现的字符支持警告,将字体修改为新宋体即可

    --解决办法: 将命令行字体修改为新宋体就可以了. 文章引用:http://www.cnblogs.com/veryinf/archive/2012/10/26/2740899.html 转载于:ht ...

  10. window10系统字体修改

    win10不同于之前的系统,没有单独的字体修改 这里介绍一个工具 1.下载noMeiryoUI 链接: https://pan.baidu.com/s/1mBqX6tBPc11Gj7LyuUvhTA ...

最新文章

  1. 《CLR Via C# 第3版》笔记之(十五) - 接口
  2. linux makefile 只能使用Tab键进行文本缩进
  3. python话雷达图-使用Python绘制雷达图
  4. python下载文件到本地-python从下载链接下载文件到本地
  5. shell脚本之日志拆分和监听
  6. ubuntu中使用VsCode+Eigen创建Eiegn应用程序
  7. 32.3. redis-cli - Command-line client to redis-server
  8. 菜鸟学Linux 第034篇笔记 vmlinuz, initrd, modules, script
  9. mysql数据库主从同步的原理_mysql数据库主从同步复制原理
  10. 什么是徽标LOGO模板?
  11. 用scikit-learn和pandas实现线性回归
  12. vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案
  13. python贴吧数据可视化_Python数据可视化
  14. 华为摄像头搜索软件_ZOOM会议软件简要操作说明-安卓手机版
  15. 计算机基础——局域网、以太网技术、令牌环网
  16. 辞职信上写什么辞职理由比较合适
  17. 【Java面试系列】ElasticSearch面试题
  18. 利用RedisTemplate报错redis Invalid UTF-32 character 0x6a607661 (above 0x0010ffff) at char #8, byte #35)
  19. LeetCode:537. 复数乘法————中等
  20. 小程序原生swiper中bindtransition监听滑动效果

热门文章

  1. 9.支撑向量机SVM
  2. 将多个Bip动作合成一个
  3. AutoSAR系列讲解(深入篇)14.2-Mcal Port配置
  4. 项目开发过程中业务流程图的绘制
  5. gitee 企业 git clone You hasn‘t joined this enterprise! 问题
  6. html语言定义诗歌教学实例,幼儿园中班语言多媒体教学活动案例:诗歌——家...
  7. 2010―2011幼儿园大班下学期班务计划
  8. 装修工人如何在网上找活
  9. 基于变量推理的知识图路径推理分析
  10. Android开发岗位要求集锦