Vous utiliseriez DialogBoxIndirectParam ou CreateDialogIndirectParam
Avec ces fonctions, il est un peu plus de travail, mais il est possible d'incruster un modèle de dialogue simple comme une struct statique initialisé dans votre code. Le format d'un modèle de boîte de dialogue comporte des tableaux de taille variable in situ, vous devez donc avoir une déclaration de structure spécifique à une boîte de dialogue particulière, mais cela fonctionne correctement pour le code de débogage.
Quelque chose comme ça
#define DLGTITLE L"Debug"
#define DLGFONT L"MS Sans Serif"
#define DLGAPPLY L"&Apply"
#define DLGCANCEL L"&Cancel"
#define NUMCHARS(aa) (sizeof(aa)/sizeof((aa)[0]))
#define IDC_BITMAP 99
#pragma pack(push, 4)
static struct { // dltt
DWORD style;
DWORD dwExtendedStyle;
WORD ccontrols;
short x;
short y;
short cx;
short cy;
WORD menu; // name or ordinal of a menu resource
WORD windowClass; // name or ordinal of a window class
WCHAR wszTitle[NUMCHARS(DLGTITLE)]; // title string of the dialog box
short pointsize; // only if DS_SETFONT flag is set
WCHAR wszFont[NUMCHARS(DLGFONT)]; // typeface name, if DS_SETFONT is set
// control info
//
struct {
DWORD style;
DWORD exStyle;
short x;
short y;
short cx;
short cy;
WORD id;
WORD sysClass; // 0xFFFF identifies a system window class
WORD idClass; // ordinal of a system window class
WCHAR wszTitle[NUMCHARS(DLGAPPLY)];
WORD cbCreationData; // bytes of following creation data
// WORD wAlign; // align next control to DWORD boundry.
} apply;
struct {
DWORD style;
DWORD exStyle;
short x;
short y;
short cx;
short cy;
WORD id;
WORD sysClass; // 0xFFFF identifies a system window class
WORD idClass; // ordinal of a system window class
WCHAR wszTitle[NUMCHARS(DLGCANCEL)];
WORD cbCreationData; // bytes of following creation data
} cancel;
struct {
DWORD style;
DWORD exStyle;
short x;
short y;
short cx;
short cy;
WORD id;
WORD sysClass; // 0xFFFF identifies a system window class
WORD idClass; // ordinal of a system window class
WCHAR wszTitle[1]; // title string or ordinal of a resource
WORD cbCreationData; // bytes of following creation data
} bitmap;
} g_DebugDlgTemplate = {
WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU // style 0x94c800c4
| DS_MODALFRAME | DS_3DLOOK
| DS_SETFONT,
0x0, // exStyle;
3, // ccontrols
0, 0, 300, 180,
0, // menu: none
0, // window class: none
DLGTITLE, // Window caption
8, // font pointsize
DLGFONT,
{
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP | BS_DEFPUSHBUTTON, // 0x50030001
WS_EX_NOPARENTNOTIFY, // 0x4
190,160,50,14,
IDOK,
0xFFFF, 0x0080, // button
DLGAPPLY, 0,
},
{
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, // 0x50010000
WS_EX_NOPARENTNOTIFY, // 0x4
244,160,50,14,
IDCANCEL,
0xFFFF, 0x0080, // button
DLGCANCEL, 0,
},
{
WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT, // 0x50020000
WS_EX_NOPARENTNOTIFY, // 0x4
6,6,288,8,
IDC_BITMAP,
0xFFFF, 0x0082, // static
L"", 0,
},
};
#pragma pack(pop)
INT_PTR CALLBACK Debug_DlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
}
break;
case WM_COMMAND:
{
UINT wId = LOWORD(wParam);
if (wId == IDOK || wId == IDCANCEL)
{
EndDialog (hwnd, wId);
}
}
break;
case WM_CLOSE:
EndDialog(hwnd, IDCANCEL);
break;
}
return FALSE;
}
LRESULT DoDebugDialog(HWND hwndApp, LPVOID pvData)
{
HINSTANCE hinst = hwndApp ? (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hwndApp, GWLP_HINSTANCE)
: (HINSTANCE)GetModuleHandle(NULL);
return DialogBoxIndirectParamW (hinst, (LPCDLGTEMPLATEW)&g_DebugDlgTemplate, hwndApp,
Debug_DlgProc, (LPARAM)pvData);
}
Une solution plus sophistiquée serait de construire une structure de modèle de dialogue dans la mémoire, mais cela fonctionne bien pour le code de débogage où la boîte de dialogue lui-même ne change pas beaucoup.
Merci! Code très utile. – huff