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 = (DLGTEMPLATE 😉 malloc ( 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 !!!


Anmelden zum Antworten