Fenster schließen ohne Applikation zu beenden.

J1M1

Erfahrenes Mitglied
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:
Code:
	// 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:
Code:
if (AfxGetApp()->m_pMainWnd != this)
in
Code:
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.

J!M!
 
Hallo,

normal muss nur die Methode "OnClose" überschrieben werden, dann kann man selber festlegen was beim Klick auf [X] passieren soll.
Hat die Anwendung dann aber kein weiteres Fenster mehr offen und ist auch kein Icon im Systray abgelegt, bleibt der Prozess aber quasi hängen, da ja jegliche Kommunikationsschnittstelle fehlt. Die Nachricht, die zu OnClose gehört ist - nicht anders zu erwarten WM_CLOSE.

Neben OnClode kann OnDestroy überschrieben werden, beide werden beim schliessen der App aufgerufen. OnClose als direkte Reaktion auf [X] und OnDestroy nach dem das Fenster bereits abgebaut wurde.

Gruß René
 
Zurück