有一个名为 RESFMT.ZIP 的文件(我认为它起源于 Microsoft,但我不完全确定),它通过一些代码示例解释了这一点。Raymond Chen 在他的博客上也做了一些很好的解释。注意 DIALOGEX 和 DIALOG 控件的格式是不同的。
正如在其他一些答案中所指出的,您需要从一开始就再次创建结构。这还不错,因为您已经掌握了基本信息。添加控件是很难的地方。
基本上,将较大的内存块分配到 WORD *lpIn 中。然后在上面添加结构。添加 DIALOG 的基本信息(请参阅 DLGTEMPLATE)和控件非常明显,因为信息在 MSDN 中。
您将遇到的两个最大问题是:确保各个部分从对齐边界开始,以及解释 DIALOG 控件的值,尤其是在仅添加字符串或字符串或序数时。每个控件都需要从一个均匀的边界开始。
对于第一个(从我认为 RESFMT.ZIP 的某个地方借来的):
WORD *AlignDwordPtr (WORD *lpIn)
{
乌龙 ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul
我所做的是构建了一系列函数,如下所示,它允许我在内存中组装 DIALOGS。(我的需要是我可以拥有一些不需要关联 RC 文件来获取一些非常基本的消息的通用代码)。
这是一个例子......
WORD *AddStringOrOrdinalToWordMem( WORD *lpw, char *sz_Or_Ord )
{
LPWSTR lpwsz;
整数缓冲区大小;
如果(sz_Or_Ord == NULL)
{
*lpw++ = 0;
}
别的
{
if (HIWORD(sz_Or_Ord) == 0) //MAKEINTRESOURCE 宏
{
*lpw++ = 0xFFFF;
*lpw++ = LOWORD(sz_Or_Ord);
}
别的
{
if (strlen(sz_Or_Ord))
{
lpwsz = ( LPWSTR ) lpw;
BufferSize = MultiByteToWideChar(CP_ACP, 0, sz_Or_Ord, -1, lpwsz, 0);
MultiByteToWideChar(CP_ACP, 0, sz_Or_Ord, -1, lpwsz, BufferSize);
lpw = lpw + 缓冲区大小;
}
别的
{
*lpw++ = 0;
}
}
}
返回(lpw);
}
完整模块的头文件包括以下功能:
WORD *AddControlToDialogTemplateEx(MTDialogTemplateType *dlgtmp,
字符 *标题,
字号,
字符 *WinClass,
双字样式,
短 x,
短 y,
短cx,
短cy,
DWORD ExStyle,
诠释帮助ID);
int DestroyDlgTemplateEx(MTDialogTemplateType *dlgtmp);
MTDialogTemplateType *CreateDlgTemplateEx( char *Name, // 我们使用 name 仅供参考,所以可以为 NULL
短 x,
短 y,
短cx,
短cy,
DWORD 扩展样式,
双字样式,
字符 *菜单,
字符 *WinClass,
字符 *标题,
字符 *FontTypeFace,
整数字体大小,
整数字体重量,
int FontItalic,
整数字符集,
整数帮助ID,
int NumberOfControls);
这使我可以轻松地从代码中组装整个对话框。