Где-то есть файл (который, я думаю, создан Microsoft, но я не совсем уверен) под названием RESFMT.ZIP, который объясняет это с помощью некоторых примеров кода. Рэймонд Чен также дает несколько отличных пояснений по этому поводу в своем блоге. Обратите внимание, что формат элементов управления DIALOGEX и DIALOG отличается.
Как отмечалось в некоторых других ответах, вам нужно будет снова создать структуру с самого начала. Это не так уж и плохо, так как у вас уже есть основная информация. Добавление элементов управления становится трудным.
По сути, выделите большой блок памяти в WORD *lpIn. Затем добавьте структуру поверх этого. добавление базовой информации для ДИАЛОГА (см. DLGTEMPLATE) и элементов управления довольно очевидно, так как информация есть в MSDN.
Две самые большие проблемы, с которыми вы столкнетесь: убедиться, что разные части начинаются на границе выравнивания, и интерпретировать значения элементов управления DIALOG, особенно когда нужно добавить только строку или строку или порядковый номер. Каждый элемент управления должен начинаться на ровной границе.
Для первого (позаимствовано откуда-то, кажется, RESFMT.ZIP):
WORD *AlignDwordPtr (WORD *lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul
Что я сделал, так это создал серию функций, подобных этой, которая позволила мне собрать ДИАЛОГ в памяти. (Мне нужно было иметь какой-то общий код, который не нуждался в связанном файле RC для некоторых очень простых сообщений).
Вот пример...
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 *Title,
WORD Id,
char *WinClass,
DWORD Style,
short x,
short y,
short cx,
short cy,
DWORD ExStyle,
int HelpID);
int DestroyDlgTemplateEx(MTDialogTemplateType *dlgtmp);
MTDialogTemplateType *CreateDlgTemplateEx( char *Name, // We use name just for reference, so it can be NULL
short x,
short y,
short cx,
short cy,
DWORD ExtendedStyle,
DWORD Style,
char *Menu,
char *WinClass,
char *Caption,
char *FontTypeFace,
int FontSize,
int FontWeigth,
int FontItalic,
int Charset,
int HelpID,
int NumberOfControls);
Это позволило мне легко собирать целые диалоги из кода.
person
David L Morris
schedule
16.10.2008