Fenster schließen ohne Applikation zu beenden.



  • Hallo!

    Erstellt man in Visual Studio 2005 (weil mir immer wieder welche sagen wollen, dass es die folgende Unterstützung überhaupt gar nicht gibt _: ) eine Applikation basierend auf "Mehrere Dokumente der höchsten Ebene" und Doc/View, so gehe man zur Funktion CMainFrame::LoadFrame().
    Dort kann man folgenden Code sehen:

    // replace Exit option on File menu with Close for secondary windows
    	/*if (AfxGetApp()->m_pMainWnd != this)
    	{
    		CMenu *pMenu = GetMenu();
    		ASSERT(pMenu);
    		pMenu->ModifyMenu(ID_APP_EXIT, MF_BYCOMMAND | MF_STRING, ID_FILE_CLOSE, _T("&Close"));
    	}*/
    

    Wenn man "/" und "/" entfernt, so wird der "Kommentar" zum Programmcode und wird ausgeführt. (Klar.:)) Es ersetzt bei weiteren Objekten von CMainFrame den Menüeintrag "Exit" mit "Close". Und wenn man nun auf diesen Menüeintrag klickt, wird nicht die ganze Applikation beendet, sondern lediglich nur das Fenster geschlossen.

    Interessant ist aber, dass dies nicht nur bei sekundären Fenstern klappt. Ändert man folgende Zeile:

    if (AfxGetApp()->m_pMainWnd != this)
    

    in

    if (AfxGetApp()->m_pMainWnd == this)
    

    um, so wird auch im ersten und einzigen (das heißt, es ist wirklich kein einziges weiteres Fenster geöffnet) der Menüeintrag "Exit" in "Close" umgeändert. Wenn man nun auf "Close", wird tatsächlich auch nur das Fenster geschlossen! Denn: Das (einzige) Fenster ist nicht mehr vorhanden, doch im Taskmanager ist der Prozess noch da.

    Die Frage nun: Welche Funktion wird denn aufgerufen, wenn man nun auf "Close" klickt? Diese könnte nämlich ganz nützlich sein und das ganze Dilemma lösen, dass beim Ausführen von "DestroyWindow()" (welche ich als einzige Funktion kenne, die mir ermöglicht ein Fenster zu schließen) nicht nur das Fenster geschlossen wird, sondern auch die ganze Applikation geschlossen wird.

    A-jage


  • Mod

    Der Handler CDocument::OnFileClose!



  • Danke.

    Und wie kann ich unter einer Funktion von CExampleView CDocument::OnFileClose() aufrufen.
    Denn folgender Code..

    CDocument* pDoc = GetDocument();
    	pDoc->OnFileClose();
    

    löst die folgende Fehlermeldung beim Kompilieren aus:

    Desktop Chat MessengerView.cpp
    e:\cppprojects\multiple_versions_of_desktopchatmessenger\desktop chat messenger\desktop chat messenger\desktop chat messengerview.cpp(325) : error C2248: 'CDocument::OnFileClose' : cannot access protected member declared in class 'CDocument'
    c:\programme\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4985) : see declaration of 'CDocument::OnFileClose'
    c:\programme\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4896) : see declaration of 'CDocument'

    A-jage


  • Mod

    Falscher Ansatz. Aus dem View kannst Du keine protected member Deiner Doc Klasse aufrufen, außer Du deklarierst eine Freund Klasse. Aber das ist IMHO unnötig und der falsche Ansatz.

    Aus dem View würde ich einfach WM_CLOSE an das GetParentFrame sendne. Dies löst IMHO den korrekten Vorgang aus. (Inkl. Speichern Abfrage).

    Willst Du in jedem Fall einfach den View schließen, dann einfach
    GetParentFrame()->DestroyWindow() aufrufen, das entsorgt den View und (bei Bedarf, wenn es nicht mehrere Vies gibt für das Dokument) auch das Dokument.



  • Ok, danke.

    A-jage


Anmelden zum Antworten