主要观点:在 Windows 对话框中动态改变字体大小较困难,以 SumatraPDF 为例,介绍了在 Windows 中实现此功能的方法及相关代码,还提及了未采用的其他方法。
关键信息:
- Windows 的 win32 API 老旧复杂,HTML 中简单的事在 win32 中困难,如改变本地桌面应用的字体大小。
- SumatraPDF 在用户要求增加字体大小时引入
UIFontSize
选项,实现困难耗时,其中改变对话框中的字体大小是问题之一。 - 对话框在
SumatraPDF.rc
中定义,编译后嵌入到 PE.exe 文件的资源部分,运行时可从资源中获取并创建对话框。 - 要在运行时改变对话框字体大小,最简单的方法是在内存中修补二进制 blob,通过
DIALOGEX
标识扩展对话框,找到字体定义部分并修改字体大小相关字段,还需处理变量长度字段的跳过等操作,代码中还包含一些辅助函数如DupTemplate
等。 - 未采用的方法有在
WM_INITDIALOG
消息中迭代所有控件改变字体并调整大小,或在运行时生成对话框的二进制 blob 以添加简单布局系统等。
重要细节: FONT 8, "MS Shell Dlg", 400, 0, 0x1
定义了字体相关信息,400
指定标准权重。IsDlgTemplateEx
和HasDlgTemplateExFont
函数用于检查对话框是否为扩展对话框及是否有可修补的字体信息。ToFontPointSize
函数用于将像素转换为 Windows 点数。SkipSzOrOrd
和SkipSz
函数用于跳过不同类型的变量长度字段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。