MDI/SDI vs. Dialog



  • Hallo!

    Es geht um MFC Applikationen, die vom Visual Studio Assistenten erstellt wurden.
    Bei dialogbasierte Anwendungen wird in der InitInstance der App-Klasse immer eine eine Instanz des Hauptdialoges auf dem Stack(?) erstellt.

    // Kurzer Code dazu
    CApp::InitInstance()
    {
       // Code vom Assistenten ...
       CMainDlg Dlg;
    
       m_pMainWnd = &Dlg;
    
       // usw.
    }
    

    Bei MDI oder auch SDI Anwendungen wird die MainFrame Klasse hingegen auf dem Heap(?) erzeugt und auch die Dokument-Templates werden so erzeugt.

    // Hier MDI Beispiel, SDI eigentlich analog
    CApp::InitInstance()
    {
       // Code vom Assistenten ...
    CMultiDocTemplate* pDocTemplate;
    	pDocTemplate = new CMultiDocTemplate(IDR_MDIAppTYPE,
    		RUNTIME_CLASS(CMDIAppDoc),
    		RUNTIME_CLASS(CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
    		RUNTIME_CLASS(CMDIAppView));
    	if (!pDocTemplate)
    		return FALSE;
    	AddDocTemplate(pDocTemplate);
    
    	// Haupt-MDI-Rahmenfenster erstellen
    	CMainFrame* pMainFrame = new CMainFrame;
    	if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
    	{
    		delete pMainFrame;
    		return FALSE;
    	}
    	m_pMainWnd = pMainFrame;
    }
    

    Später werden die Zeiger nicht gelöscht. Das scheint intern zu geschehen. Wo denn und warum ist das so? Kann man auch hier die Klassen auf dem Stack erstellen wie beim Dialogbeispiel oder warum ist das hier so gelöst?

    Ich habe z.B. eine SDI App, die den MainFrame per new erzeugt aber ein Stack-Instanz von CCreateContext. Also ähnlich wie in diesem Beispiel. Ist das korrekt so?



  • Ist die Frage so merkwürdig oder weiß das etwa niemand?


  • Mod

    Klassen, die von CFrameWnd abgeleitet werden zerstören sich mit delete this in OnNcDestroy/PostNcDestroy.
    CDialog Klassen sind dafür angelegt auf dem Stack zu existieren und haben keinen delete this.

    Da aber in InitInstance bei einer Dialog Anwendung DoModal aufgerufen wird, hat dieses Objekt keine Lebensdauer über InitInstance hinaus.
    Zudem wird der m_pMainWnd Zeiger automatisch auf NULL zurück gesetzt, wenn der Dialog endet.
    m_pMainWnd wird nur als Zeiger in vielen internen MFC Routinen benötigt um eben das Hauptapplikationsfenster zu bestimmen.

    Gleiches gilt für die Document Templates. Diese sind Bestandteil des DocumentManagers der Applikation, der automatisch abgeräumt wird, wenn die Applikation terminiert.

    HTH



  • Danke für die Information.


Anmelden zum Antworten