RESFMT.ZIP という名前のファイルがどこかにあります (これは Microsoft に由来すると思いますが、完全にはわかりません)。これは、いくつかのコード例でこれを説明しています。Raymond Chen も、彼のブログでこれについて優れた説明を行っています。DIALOGEX コントロールと DIALOG コントロールの形式が異なることに注意してください。
他のいくつかの回答で述べたように、最初から構造を再度作成する必要があります。基本的な情報はすでにあるので、これはすべて悪いことではありません。コントロールを追加するのは難しいところです。
基本的に、大きなメモリ ブロックを WORD *lpIn に割り当てます。次に、その上に構造を追加します。DIALOG の基本情報 (DLGTEMPLATE を参照) とコントロールの追加は、MSDN に情報があるため、非常に明白です。
発生する 2 つの最大の問題は、さまざまな部分が整列境界で始まることを確認することと、DIALOG コントロールの値を解釈することです。特に、文字列のみ、または文字列または序数を追加する場合は特にそうです。各コントロールは、偶数境界で開始する必要があります。
最初の場合(RESFMT.ZIPと思われる場所から借用):
WORD *AlignDwordPtr (WORD *lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ウル
私がしたことは、次のような一連の関数を構築することで、メモリ内で DIALOGS を組み立てることができました。(私の必要性は、いくつかの非常に基本的なメッセージに関連付けられた RC ファイルを必要としない一般的なコードを持つことができるようにするためでした)。
ここに例があります...
WORD *AddStringOrOrdinalToWordMem( WORD *lpw, char *sz_Or_Ord )
{
LPWSTR lpwsz;
int BufferSize;
もし (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 + BufferSize;
}
そうしないと
{
*lpw++ = 0;
}
}
}
return( lpw );
}
完全なモジュールへのヘッダー ファイルには、次の関数が含まれていました。
WORD *AddControlToDialogTemplateEx(MTDialogTemplateType *dlgtmp,
char *タイトル、
ワードID、
char *WinClass,
DWORD スタイル、
短い×、
短いy、
短いcx、
ショートサイ、
DWORD ExStyle、
int HelpID);
int DestroyDlgTemplateEx(MTDialogTemplateType *dlgtmp);
MTDialogTemplateType *CreateDlgTemplateEx( char *Name, // 参照用に名前を使用するため、NULL にすることができます
短い×、
短いy、
短いcx、
ショートサイ、
DWORD 拡張スタイル、
DWORD スタイル、
char *メニュー、
char *WinClass,
char *キャプション,
char *FontTypeFace,
int フォントサイズ、
int FontWeigth、
int FontItalic、
int 文字セット、
int HelpID、
int NumberOfControls);
これにより、コードからダイアログ全体を簡単に組み立てることができました。