Dialog ohne Resource



  • Hallo!

    Irgendwie komme ich nicht weiter. Ich möchte einen Dialog ohne eine Dialog-Resource erstellen. Hierzu habe ich mir eine Klasse von CDialog abgeleitet. Als protected Member habe ich eine Variable vom Typ

    DLGTEMPLATE m_DlgTemplate
    

    angelegt.

    Ich komme aber überhaupt nicht damit zu Recht. In der App-Klasse versuche ich meine Dialogfeldklasse mit DoModal zu starten. Es erscheint aber kein Dialogfeld. Google spuckt auch keine für mich brauchbaren Treffer dazu aus.

    Meine DLGTEMPLATE Struktur initialisiere ich wie folgt im Konstruktor der Klasse:

    this->m_DlgTemplate.style           = WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE;
    this->m_DlgTemplate.dwExtendedStyle = 0;
    this->m_DlgTemplate.cdit            = 0;
    this->m_DlgTemplate.x               = 100;
    this->m_DlgTemplate.y               = 100;
    this->m_DlgTemplate.cx              = 600;
    this->m_DlgTemplate.cy              = 600;
    
    // AppClass::InitInstance relevanter Code
    
    DialogTemplate Tpl();
    //this->m_pMainWnd = &Tpl;
    Tpl.InitModalIndirect(); // <- Hier wird einfach nur "intern" CDialog::InitModalIndirect(&this->m_DlgTemplate); aufgerufen
    INT_PTR nResponse = Tpl.DoModal();
    // ...
    

    Mein Dialogfeld erscheint nicht. Kann mir jemand helfen oder kennt jemand ein einfaches Beispiel?

    Gruß Jochen


  • Mod

    1. Was sagt GetLastError?
    2. Du könntest InitModalIndirect selberin Deinem Konstruktor aufrufen.



  • Martin Richter schrieb:

    1. Was sagt GetLastError?

    Hmm, am Ende von InitInstance ist GetLastError 0. Allerdings wenn ich die CDialog::DoModal mit F11/f10 durchlaufe komme ich irgendwann an eine Stelle wo intern GetLastError 1813 ist.

    Fehler 1813:
    "Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden."
    

    Martin Richter schrieb:

    2. Du könntest InitModalIndirect selberin Deinem Konstruktor aufrufen.

    Ändert nichts.

    P.S.: Es scheint unsinnig kompliziert zu sein mit DLGTEMPLATE zu arbeiten, da alle Internetbeispiele u.a. Speicher mit GlobalAlloc allozieeren und irgendwelche wilden Zusatzbytes an die Struktur heften. Ich möchte aber keine weiteren Controls innerhalb des Templates erstellen. Das mache ich später anders. Wäre es vielleicht einfacher meine Klasse von CWnd abzuleiten und einfach dort mit Create/CreateWindow zu arbeiten? Nur wie lasse ich den Dialog angezeigt wie bei DoModal? Das Fenster schließt sich immer wieder sofort.

    Gruß Jochen


  • Mod

    Zeig mir mal Deinen Konstrukor Deines Dialoges.
    Wird dort evtl. einen Template ID übergeben.

    Also ist nach der Konstruktion Deines Dialog Objektes evtl. m_hDialogTemplate!=NULL



  • Martin Richter schrieb:

    Zeig mir mal Deinen Konstrukor Deines Dialoges.
    Wird dort evtl. einen Template ID übergeben.

    Es wird keine ID übergeben. Hier der Code

    DialogTemplate::DialogTemplate (LPCTSTR     lpCaption,
                                     CWnd      * pParentWnd,
        : CDialog(),
          m_lpCaption(lpCaption),
          m_pParentWnd(pParentWnd),
    {
        this->m_DlgTemplate.style           = WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE;
        this->m_DlgTemplate.dwExtendedStyle = 0;
        this->m_DlgTemplate.cdit            = 0;
        this->m_DlgTemplate.x               = 100;
        this->m_DlgTemplate.y               = 100;
        this->m_DlgTemplate.cx              = 600;
        this->m_DlgTemplate.cy              = 600;
    
        CDialog::InitModalIndirect(&this->m_DlgTemplate, this->m_pParentWnd);
    }
    

    Martin Richter schrieb:

    Also ist nach der Konstruktion Deines Dialog Objektes evtl. m_hDialogTemplate!=NULL

    Nein, m_hDialogTemplate ist NULL.[cpp]


  • Mod

    Dann steppe mal in den DoModal Code rein und schau mal nach wo er versucht das Template zu Laden.



  • Martin Richter schrieb:

    Dann steppe mal in den DoModal Code rein und schau mal nach wo er versucht das Template zu Laden.

    Also in der "dlgcore.cpp" ab Zeile 312 "// create modeless dialog"...
    Hier scheint es schief zu gehen, denn "::CreateDialogIndirect" gibt NULL statt einem gültigen Fensterhandle zurück. Es folgt "GetLastError" mit 1813.


  • Mod

    Dann ist Dein Template falsch.
    Was folgt Deiner Template Struktur. Hast Du darauf geachtet, das im Minimum 3 0x0000 Wörter folgen müssen? (Menü, Klasse, Titel)

    http://msdn2.microsoft.com/en-us/library/ms645394.aspx



  • Martin Richter schrieb:

    Dann ist Dein Template falsch.
    Was folgt Deiner Template Struktur. Hast Du darauf geachtet, das im Minimum 3 0x0000 Wörter folgen müssen? (Menü, Klasse, Titel)

    http://msdn2.microsoft.com/en-us/library/ms645394.aspx

    Daran wird es liegen. Habe mal wieder die Remarks Sektion zu schnell überflogen.
    Btw: Habe es aber anders gelöst, da ich meine TemplateDialog Klasse eigentlich ursprünglich lediglich von CWnd ableiten wollte. So habe ich es nun auch getan und es funktioniert einwandfrei. Werde allerdings trotzdem noch einmal die CDialog Variante testen um zu schauen, ob es wirklich "nur" daran gelegen hat.
    Falls erwünscht, kann ich mich dann noch einmal melden.

    Gruß Jochen


  • Mod

    Beachte, dass Du dann nicht die Standard Features aus dem PreTranslateMessage Bereich hast.

    War es Deine Intention ein nicht modales Fenster zu erzeugen?



  • Martin Richter schrieb:

    Beachte, dass Du dann nicht die Standard Features aus dem PreTranslateMessage Bereich hast.

    Oh. Welche sind denn das?

    Martin Richter schrieb:

    War es Deine Intention ein nicht modales Fenster zu erzeugen?

    Eigentlich nicht. Es sollte schon ein modaler Dialog sein. Schließlich implementiert die Klasse auch eine Methode DoModal(). Hier habe ich mir den Code von CPropertySheet (leitet von CWnd ab) und CDialog angeschaut und DoModal ähnlich implementiert.

    Gruß Jochen


Anmelden zum Antworten