在 C++ 中在 Windows 对话框中更改字体大小

主要观点:在 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指定标准权重。
  • IsDlgTemplateExHasDlgTemplateExFont函数用于检查对话框是否为扩展对话框及是否有可修补的字体信息。
  • ToFontPointSize函数用于将像素转换为 Windows 点数。
  • SkipSzOrOrdSkipSz函数用于跳过不同类型的变量长度字段。
阅读 11
0 条评论