社区
Windows SDK/API
帖子详情
怎样取得一个字体的所有字号?
sandro626
2004-12-16 11:48:43
请问大家:怎样取得一个字体的所有字号?
...全文
102
2
打赏
收藏
怎样取得一个字体的所有字号?
请问大家:怎样取得一个字体的所有字号?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhangheaaa
2004-12-29
打赏
举报
回复
Delphi 字号修改
微软推荐的字体设置方法:
nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
大家也看到了,最后一个参数是 72 ,也就是十六进制的 0x48 ,而且它是一个常数,所以这样的语句编译到可执行文件中的时候就会出现一个明显的 push 00000048 的语句,而且,因为 72 是最后一个参数,所以这个 push 语句是这一行程序的第一个 push 语句,这样,上次我们介绍的修改消息框的方法就可以用 push 00000048 作为辅助判断方法,据大宇说,用这种方法判断,迄今为止是百发百中的。 :)
而这一次的 Hint 的问题,因为在反编译出来的文件中找不到“push 00000008 * Reference To: kernel32.MulDiv,”或上面几行没有“push 00000048”,所以无法找到需要修改的地方,我通过查找代码发现,对于 Hint 的字体设置,其中并不是直接压入 8 ,也就是说没有明显的 push 00000008 ,但是仍然是可以修改的。
以前 ChinEase 曾问过 iProtect SoHo 的字体问题,当时我并不熟悉,以为主界面是使用了枚举的方式设置的字体,觉得不能解决,不过现在才发现其实其主界面字体是可以自己设置的,所以所剩的字体问题仍然是 Hint 的问题,在这里就以 iProtect SoHo 为例说一下。
用 W32dasm 反编译 iprotect.exe ,生成 iprotect.alf ,打开它,查找 push 00000048 ,发现四个,其中后两个一个因为在 call MulDiv 之上的语句是 push 00000009 ,所以已经是 9 磅的字体,另一个后面根本没有 call MulDiv ,所以更不是我们所要找的语句了,剩下的两个如下:
* Referenced by a CALL at Addresses: |:00412279 , :00416EAA , :0041D93C , :00425408 , :004BAFCA |:004BB710 | :0041DB38 53 push ebx :0041DB39 8BD8 mov ebx, eax :0041DB3B 8B4314 mov eax, dword ptr [ebx+14] :0041DB3E 50 push eax :0041DB3F 6A48 push 00000048 :0041DB41 8BC3 mov eax, ebx :0041DB43 E864FFFFFF call 0041DAAC :0041DB48 50 push eax * Reference To: kernel32.MulDiv, Ord:0000h | :0041DB49 E8A67BFEFF Call 004056F4 :0041DB4E F7D8 neg eax :0041DB50 5B pop ebx :0041DB51 C3 ret :0041DB52 8BC0 mov eax, eax * Referenced by a CALL at Addresses: |:00412298 , :00416EB9 , :0041AE0F , :0041D945 , :00425417 |:0043CC63 , :0043D62A , :00471F31 , :004914F4 , :0049CB09 |:004B6212 , :004BA4DA , :004BA51E , :004BB720 , :004D4955 | :0041DB54 53 push ebx :0041DB55 56 push esi :0041DB56 8BF2 mov esi, edx :0041DB58 8BD8 mov ebx, eax :0041DB5A 6A48 push 00000048 :0041DB5C 8B4314 mov eax, dword ptr [ebx+14] :0041DB5F 50 push eax :0041DB60 56 push esi * Reference To: kernel32.MulDiv, Ord:0000h | :0041DB61 E88E7BFEFF Call 004056F4 :0041DB66 8BD0 mov edx, eax :0041DB68 F7DA neg edx :0041DB6A 8BC3 mov eax, ebx :0041DB6C E843FFFFFF call 0041DAB4 :0041DB71 5E pop esi :0041DB72 5B pop ebx :0041DB73 C3 ret
可以看到,在 call MulDiv 之上并不是压入的常数,而是寄存器值,而这两段代码其实是函数,所以它是通过别人调用来设置的,这需要跟踪才能知道究竟是谁在调用,我最近发现其实 W32dasm 也可以进行动态跟踪,因为不会中止其它进程,所以我现在比较喜欢用 W32dasm 来跟踪 ―― 可以同时听 mp3 。 :) 不过 W32dasm 的跟踪界面有些零乱,我就不介绍了。在这里,跟踪到调用者:
:0041ADFA BA38AE4100 mov edx, 0041AE38 :0041ADFF 8B460C mov eax, dword ptr [esi+0C] :0041AE02 E8ED2C0000 call 0041DAF4 :0041AE07 BA08000000 mov edx, 00000008 :0041AE0C 8B460C mov eax, dword ptr [esi+0C] :0041AE0F E8402D0000 call 0041DB54
就是最后一个 call 0041DB54 调用了上面的设置字体的代码,我们发现很明显的上面有一个 mov edx, 00000008 ,我们尝试把它修改成 mov edx, 0000000F ,运行程序,发现 Hint 的字体真的变得很大了,也就是说,改对地方了。
另外,第一句的 mov edx, 0041AE38 其实压入的是字体名,所以最后的修改是:把 0x1a239 处的“MS Sans Serif”改成“宋体”,把 0x1a208 处的 08 改成 09 。(0x1a238 处是字体名的长度计数器,最好也修改成 04)
sandro626
2004-12-29
打赏
举报
回复
怎么没人回答,随便乱顶一下
Droid Sans Mono
字体
我最喜欢的免费
字体
系列,以Vera为基础,但是比后者提供更多字符了。适于任何
字号
,需要anti-aliasing。
全国计算机二级OFFICE考试中怎么看word的
字体
字号
?
在正规考试会列明需要使用和修改的
字体
与
字号
的要求,和目前练习题库中大部分只... 2、目前练习题库中大部分只提供图片参考,这在正式考试中是不存在的,考试的时候会给
一个
样板和
一个
说明,与真题练习的不一样。 ...
Jupyter Notebook如何修改主题、
字体
、
字号
?分分钟搞定!!!
对于强迫症的我来说,Jupyter Notebook的代码
字体
实在是不能忍受;我试过CSDN、简书、知乎上面的主流方法,由于各种原因还是失败,终于历经多时终于成功了,感谢GitHub大佬,打造了这款“神器”以适应大众需求。 ...
Ueditor编辑器修改
字体
和
字号
?
这样就可以实现和word相同
字号
了。 添加
字体
直接修改ueditor.config.js中的fontfamliy如下: //fontfamily //
字体
设置 label留空支持多语言自动切换,若配置,则以配置值为准 , 'fontfamily' ...
python中设置
字体
大小_python如何设置写入表格的
字体
字号
?
我们在做表格时候,可以通过自带的功能,设置
字体
字号
,那大家在学习编程时,有没有想过用编程去改变的呢?答案时肯定的!下面一起来看看这好玩的设置方法吧~功能描述:首先生成几个测试用的Excel文件,然后批量修改...
Windows SDK/API
1,183
社区成员
22,335
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章