Где-то есть файл (который, я думаю, был создан в Microsoft, но я не совсем уверен) под названием RESFMT.ZIP, который объясняет это некоторыми примерами кода. Раймонд Чен также делает несколько превосходных объяснений этому в своем блоге. Обратите внимание, что формат элементов управления DIALOGEX и DIALOG различен.
Как отмечалось в некоторых других ответах, вам потребуется заново создать структуру с самого начала. Это не так уж плохо, поскольку у вас уже есть основная информация. Добавление элементов управления - вот что становится сложным.
По сути, выделите большой блок памяти в WORD * lpIn. Затем добавьте структуру сверху этого. добавление базовой информации для DIALOG (см. DLGTEMPLATE) и элементов управления довольно очевидно, так как информация есть в MSDN.
Две самые большие проблемы, с которыми вы столкнетесь: Убедитесь, что различные детали начинаются на границе выравнивания, и интерпретируйте значения элементов управления DIALOG, особенно когда нужно добавить просто строку или строку или порядковый номер. Каждый элемент управления должен начинаться с четной границы.
Для первого (позаимствованного у меня, думаю, RESFMT.ZIP):
WORD *AlignDwordPtr (WORD *lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul
<p>What I did was build a series of functions like this one following that allowed me to assemble DIALOGS in memory. (My need was so I could have some common code that didn't need an associated RC file for some very basic messages).</p>
<p>Here is an example...</p>
<pre>
WORD *AddStringOrOrdinalToWordMem( WORD *lpw, char *sz_Or_Ord )
{
LPWSTR lpwsz;
int BufferSize;
if (sz_Or_Ord == NULL)
{
*lpw++ = 0;
}
else
{
if (HIWORD(sz_Or_Ord) == 0) //MAKEINTRESOURCE macro
{
*lpw++ = 0xFFFF;
*lpw++ = LOWORD(sz_Or_Ord);
}
else
{
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 + BufferSize;
}
else
{
*lpw++ = 0;
}
}
}
return( lpw );
}
Файл заголовка для всего модуля включает следующие функции:
WORD * AddControlToDialogTemplateEx (MTDialogTemplateType * dlgtmp,
char * Заголовок,
WORD Id,
char * WinClass,
Стиль DWORD,
короткий х,
коротко,
короткая сх,
коротко,
DWORD ExStyle,
int HelpID);
int DestroyDlgTemplateEx (MTDialogTemplateType * dlgtmp);
MTDialogTemplateType * CreateDlgTemplateEx (char * Name, // Мы используем имя только для справки, поэтому оно может быть NULL
короткий х,
коротко,
короткая сх,
коротко,
DWORD ExtendedStyle,
Стиль DWORD,
char * Меню,
char * WinClass,
char * Caption,
char * FontTypeFace,
int FontSize,
int FontWeigth,
int FontItalic,
Int Charset,
int HelpID,
int NumberOfControls);
Что позволило мне легко собрать целые диалоги из кода.