C ++ Win32api, créer une boîte de dialog sans ressource

Je suis nouveau à la programmation de win32api. Je voudrais savoir comment créer une boîte de dialog dans un programme non-gui (sans aucune ressource créée).

J’ai vu des exemples avec cette fonction CreateIndirect . Est-ce la meilleure méthode? Un autre moyen?

Merci!

Vous utiliseriez DialogBoxIndirectParam ou CreateDialogIndirectParam

Avec ces fonctions, c’est un peu plus de travail, mais il est possible d’insérer un simple modèle de dialog en tant que structure statique initialisée dans votre code. Le format d’un modèle de boîte de dialog comporte des tableaux de taille variable, vous devez donc avoir une déclaration de structure spécifique à une boîte de dialog 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 ssortingng 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 ssortingng 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 consisterait à construire une structure de modèle de dialog en mémoire, mais cela fonctionne bien pour le code de débogage où la boîte de dialog elle-même ne change pas beaucoup.