Wie wird beim Zumachen des Hauptfensters verfahren?

lindin

Erfahrenes Mitglied
Hallo, ich habe mal eine Frage!
Ich habe in meinem Programm ein Hauptfenster! Wenn diese geschlossen werden, dann werden alle zu diesem Fenster zugehörigen "Unterfenster" auch geschlossen!
Das soll auch so sein!
Nur, wenn das passiert, dann wird die WM_DESTROY-Nachricht nicht mehr in den Unterfenstern behandelt!
Wird diese dann gar nicht aufgerufen?
 
Die Unterfenster (Child-Fenster und alle Fenster, die das Hauptfenster als Owner haben) bekommen alle ein WM_DESTROY. Das erfolgt VOR dem WM_DESTROY des Hauptfensters.
 
Also bei mir funktioniert das nicht!
Ich möchste bei WM_DESTROY den Text aus einem Fenster in eine Datei schreiben!
Das wird gemacht, wenn ich das Fenster so schließe, aber nicht,, wenn es durch das Schließen des Hauptfensters geschlossen wird!
 
Ich habs falsch rum: Das Hauptfenster bekommt zuerst ein WM_DESTROY, danach alle Unterfenster.

Eventuell sind die Fensterinhalte während WM_DESTROY nicht mehr zugänglich.

Hast du geprüft, ob der WM_DESTROY-Handler denn tatsächlich in einem Fall aufgerufen wird, im anderen nicht?
 
Naja, also das wäre natürlich logisch, daß die Fensterinhalte dann nicht mehr zugänglich sind!
Habs überprüft, sonst ständ ja ensprechendes in der Datei!

Könnte ich denn bei dem Hauptfenster das destroy (X) unterbrechen und eien "Achtung wollen sie wirklich schließen" ja/nein -Meldung per MessageBox einbauen oder bedeutet das (X) Ende ohne Möglichkeit das zu stoppen?
 
Ja klar geht das. Das (X)-drücken kommt über WM_CLOSE rein. Nur da kann man es abbrechen. Bei WM_DESTROY ist es zu spät, das ist nur noch eine Mitteilung, das das Fenster jetzt kaputtemacht ist.

Wenn du WM_CLOSE abfängst und nicht DestroyWindow aufrufst bzw. WM_CLOSE an die DefWindowProc weitergibts, dann passiert nichts, das Fenster bleibt auf.
 
Also, ich habe jetzt beim Schließen des Hauptfensters (WM_CLOSE) eine WM_CLOSE-NAchricht an alle unterfenster geschickt, bei der ich dann in die DAtei schreibe, danach im Hauptfenster eine WM_DESTROY, und es funktioniert nicht!
 
Hmmm, irgendwo ist da noch ein anderer Wurm drin.
Kannst du das Projekt denn irgendwie minimal zusammenpacken und hier posten? Dann gugg ich mal drüber, ich finde das seltsam, dass das WM_DESTROY nicht sauber durchkommt. Da geht irgendwo was verschütt.
 
Also, ich poste Dir mal die Teile:

Code:
//Die Unterfenster sind in einem HWND-Array, es gibt immer höchstens x, x beginnt bei 1
for (int l=0;l<x;l++){
   //chat ist eine HWND-Variable
   chat=chatArray[l];
   if(chat) SendMessage(chat,WM_CLOSE,NULL,NULL);
}
//hWnd ist dieses aktuelle Fenster
SendMessage(hWnd,WM_DESTROY,0,0);
return 0;

Code:
//Unterfenster
switch (WM_COMMAND){
case IDCANCEL
     //das will ich eigentlich machen, es kommt aber immer wieder bei IDCANCEL an
    //SendMessage(hDlg,WM_CLOSE,NULL,NULL);
  DestroyWindow(hDlg);
     break;
 }
     return(TRUE);
	 case WM_CLOSE:
	//in datei schreiben

	SendMessage(hDlg,WM_DESTROY,NULL,NULL);
	 break;
     
   }


Also ich versteh auch nicht, wieso der bei IDCANCEL keine Nachricht an WM_CLOSE schickt, sondern da hängen bleibt
 
Zurück