Hauptdialog schließen

sTEk

Erfahrenes Mitglied
Ich möchte meinen Hauptdialog (SDI-Anwendung, CFormView) mit dem Schließen-Kreuz (ON_WM_CLOSE) und dem Menüpunkt "Beenden" (ON_IDD_APP_EXIT) beenden.

Über das Abfangen von ON_WM_CLOSE ist mir das mittels OnClose() möglich, wenn ich jedoch den "Beenden"-Punkt abfange und dort OnClose() aufrufe oder die Nachricht WM_CLOSE durch SendMessage(WM_CLOSE,0,0) absetze wird das Fenster nicht geschlossen. :(
Wo liegt mein Denkfehler?
 
Danke! Jedoch das klappt leider auch nicht richtig. :(
Ich muss "Beenden" zwei mal hintereinander anklicken, damit das Fenster geschlossen wird - warum das?

Ich habe übrigens gerade herausbekommen, dass die OnClose()-Funktion aufgerufen wird, wenn ich selber die Nachricht absetze, nur das Fenster schließt in dem Fall nicht.
 
Versuch mal CloseWindow aufzurufen, anstatt WM_CLOSE zu senden.

Rufst du in deinem OnClose-Handler auch noch die Basisklasse auf?
 
Zuletzt bearbeitet:
Ich glaube, ich weiß woran es liegt - nur leider komme ich nicht auf die Lösung.

Wenn ich CloseWindow(); aufrufe schließt er lediglich den View im Hauptdialog.
Komisch ist jedoch, dass das hier
Code:
void CKabTEC192SEView::OnClose() 
 {
 	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
 	if (m_COMZustand)
 		OnTrennen();
 	delete [] m_EEPROM_Inhalt;
 	delete [] m_EEPROM_Inhalt_save;
 	CFormView::OnClose();
 }
funktioniert, wenn die Nachricht direkt vom "Schließen-Kreuz" kommt, wenn ich die Nachricht jedoch selbst schicke, dann ruft er die Funktion zwar auf, jedoch zeigt das CFormView::OnClose(); keine Wirkung mehr...
 
Beim "Schließen-Kreuz" passiert schon etwas mehr, als nur das Beenden des Views. Es wird noch das Frame-Windows geschlossen und die Message Queue des Applikations Threads beendet.
Das leistet der von mir gepostete Code.
 
Wenn ich die von Dir gepostete Lösung
Code:
PostMessage(WM_COMMAND, ID_APP_EXIT, 0);
nutze, kommt es zu einem Debug-Fehler:

Fehler in dbgheap.h
Line 1011

Expression: _CrtIsValidHeapPointer(pUserData)
 
Benutzt du in deinem Projekt DLLs oder ActiveX? Das Problem entsteht dadurch, dass Speicher im Heap des einen Teils (EXE oder DLL) allokiert und in jeweils anderen wieder freigegeben wird. Ich denke, dass vor dem Absetzen der Message noch irgendwelche Aufräumarbeiten nötig sind.
 
Ich meine, das CloseWindow solltest du am Mainframe anbringen, nicht an deinem View. Kann sein, dass daher die assertation kommt, du killst den letzten View von deinem einzigen Dokument; dafür ist SDI nicht ausgelegt.
 

Neue Beiträge

Zurück