对话框模板简史-32位扩展模板
总算到了我真正想说的主题了,32位扩展对话框模板,它在资源文件中以DIALOGEX来声明。
下图展示了对话框模板的历史变迁:
一点儿也不特别,对吧?
好吧,让我们继续研究。32位扩展对话框是16位扩展对话框模板的32位版本,所以接下来的内容和之前的文章会看起来十分的熟悉。
首先是头部,下图展示了一个32位扩展对话框资源的头部:
前面两个字段和16位扩展版本一样:它们指明了这个对话框模板是一个扩展的对话框模板。
接下来的两个字段是新增加的。帮助标识符通过SetWindowContextHelpId被挂接到对话框上,然后是扩展对话框的风格,这对于你来说,应该一点也不会意外吧?
接下来,你懂的:3个字符串指示了菜单名称,类名称和对话框标题。因为这是一个32位的模板,所以所有字符串都是Unicode格式的。
从16位扩展版本开始,可选的自定义字体信息包含了更加丰富的信息:
和之前一样,字体大小,重量,斜体和字符集都可以传入到API函数CreateFont中。
头部之后,就是对话框控件模板,每个控件模板必须对齐到DWORD边界。
带来的改变是:
> 新的dwHelpID和dwExStyle字段。
> 移除了dwStyle字段。
> 控件ID被扩展到了32位类型。
并不是将控件ID扩展为32位值会有帮助,因为WM_COMMAND和类似消息仍使用16位值来传递控件ID。 因此,实际上,你不能使用大于16位的值。 (好吧,假设你拥有控件的窗口句柄,则始终可以忽略控件ID字段,并通过GetDlgCtrlID函数检索完整的32位控件ID。)
下图是模板资源的一份内存转储:
首先是头部,如下:
根据前面描述的规则,解析如下:
接下来是菜单名称,类名称及对话框标题:
因为设置了DS_SETFONT风格,接下来是字体信息。请注意,对于扩展版本的对话框,字体信息中包含了一些额外的信息,如下图所示:
接下来是对话框控件的模板,请注意,它们必须在DWORD边界上对齐。
你可能已经猜到了这个实例对话框是查找替换的对话框。这是有一点区别需要注意,它使用了关键字DIALOGEX,而不是DIALOG。
DIALOGEX 36, 44, 230, 94
总结
至此,我们已经将所有的对话框模板格式都讲解了一遍,你学会了吗?
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The evolution of dialog templates – 32-bit Extended Templates》
- 下一篇: 对话框模板简史-终章
- 上一篇: 对话框模板简史-16位扩展模板
相关推荐
- TopomelBox:高效能人士的选择
- Posted on 01月27日
- 实战经验:在DLL中支持多语言
- Posted on 07月29日
- 关于WinMain函数的第二个参数解释
- Posted on 04月08日
- C++20: 缩写函数模板和约束性Auto
- Posted on 02月06日
评论已关闭。