DialogBoxIndirect
-
Hallo !
Hat jemand hier schon mal mit DialogBoxIndirect experimentiert und kann mir bezüglich der DLGTEMPLATE- und DLGITEMTEMPLATE-Struktur ein paar Tipps bezüglich der Bereitstellung geben ?
Ich progammiere in C mit MS-VC
Gruss d_A
-
Sicher hat das schon jemand gemacht. Das ist auch eigentlich gar nicht so wild. Was genau ist Dir denn unklar?
-
naja,
ich habe mir gedacht dass ich z.B. eine DialogBox mit meinetwegen 2 Buttons dynamisch erstellen will. Mit dieser Vorstellung hab ich dann:DLGTEMPLATE *dlgt;
DLGITEMTEMPLATE *dlgit;
dlgt = (DLGTEMPLATEmalloc ( sizeof ( DLGTEMPLATE ) + (2 * sizeof ( DLGITEMTEMPLATE )));
Speicher allokiert. Diesen habe ich dann mit Werten gefüllt.
Nachdem die DialogBox nicht erschienen ist hab ich in der MSDN-Library nachgelesen und erfahren, dass hinter den Strukturen DLGTEMPLATE und DLGITEMTEMPLATE noch DWORD-aligned Werte hinterstehen müssen.
Diese variablen Array die erwartet werden sollen dann auch noch UNICODE-Strings sein. Und da komme ich nicht weiter, wie ich das zusammenbasteln muss.Gruss d_A
-
DLGITEMTEMPLATE noch DWORD-aligned Werte hinterstehen müssen.
WORD-aligned, sie müssen WORD-alignes ein! Aber gut, ich hab Dir mal ein Sample zusammengestellt, ganz in C (aber mit nur einem Button).
#include <pshpack2.h> typedef struct { DLGTEMPLATE tmpl; WCHAR wszMenu[1]; WCHAR wszClassName[1]; WCHAR wszTitle[8]; SHORT sPointSize; WCHAR wszFaceName[8]; } MYTEMPLATE, *PMYTEMPLATE, *LPMYTEMPLATE; typedef struct { DLGITEMTEMPLATE tmpl; WCHAR szClassName[2]; WCHAR szTitle[9]; WORD wSizeofCreationData; } MYITEMTEMPLATE, *PMYITEMTEMPLATE, *LPMYITEMPLATE; typedef struct { MYTEMPLATE dlgTempl; MYITEMTEMPLATE itemTemplate; } MYCOOLDIALOG, *PMYCOOLDIALOG, *LPMYCOLDIALOG; #include <poppack.h> INT_PTR CALLBACK MyCoolDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: return(TRUE); case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: case IDCANCEL: EndDialog(hWnd, 0); return(TRUE); default: break; } break; default: break; } return(FALSE); } BOOL MyCoolDialog(HWND hWndParent) { MYCOOLDIALOG dlg; ZeroMemory(&dlg, sizeof(dlg)); dlg.dlgTempl.tmpl.style = WS_VISIBLE | DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU; dlg.dlgTempl.tmpl.cdit = 1; dlg.dlgTempl.tmpl.x = 20; dlg.dlgTempl.tmpl.y = 20; dlg.dlgTempl.tmpl.cx = 200; dlg.dlgTempl.tmpl.cy = 200; wcscpy(dlg.dlgTempl.wszTitle, L"MyTitle"); dlg.dlgTempl.sPointSize = 8; wcscpy(dlg.dlgTempl.wszFaceName, L"Courier"); dlg.itemTemplate.tmpl.style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; dlg.itemTemplate.tmpl.x = 75; dlg.itemTemplate.tmpl.y = 93; dlg.itemTemplate.tmpl.cx = 50; dlg.itemTemplate.tmpl.cy = 14; dlg.itemTemplate.tmpl.id = IDOK; dlg.itemTemplate.szClassName[0] = 0xFFFF; dlg.itemTemplate.szClassName[1] = 0x0080; wcscpy(dlg.itemTemplate.szTitle, L"zumachen"); DialogBoxIndirect(g_hInst, &dlg.dlgTempl.tmpl, hWndParent, MyCoolDlgProc); return(TRUE); }
Unabhängig davon solltest Du trotzdem mal einen Blick in das UNICODE-Kapitel des Petzold-Buches werfen.
-
das habe ich so schnell und ausführlich nicht erwartet.
Und dein Blick in die Kristallkugel war auch nicht schlecht, denn das Kapitel 2 hab ich bisher immer (wenn auch mit schlechtem Gewissen) überschlagen !
Vielen Dank !
-
In den FAQ gibts nen Thread über sowas. Schau mal unter "InputBox(...)" nach.
-
hmmm
da hab ich dann was fürs Wochendende !
Wissen wie es geht .. oder wissen wo es steht
Dankeschön !!!