Einzelnes Fenster zerstörten ohne das Programm zu beenden ?
-
Hoi Leute,
ich bin gerade etwas am Programmieren mit der WinApi, was ein GUI benötigt.
Dabei bin ich wieder auf eine Frage gestoßen, die ich mir öfters gestellt habe und auf die ich einfach keine Antwort gefunden habe :Wie zerstöre ich ein einzelnes Fenster ohne den gesamten Prozess zu beenden?
Die Sache ist ja : Die Beendigung des Prozesses kommt daher, dass irgendwo in der Callback function zu dem entsprechenden Fenster :case WM_DESTROY : PostQuitMessage(0); breakM
steht. Klar. Aber ... was soll da sonst stehen.
a) Wenn ich den case-branch rausnehme passiert bei einem zB DestroyWindow() call gar nichts.
b) Was ist die Alternative ?! Ich kann ShowWindow mit false aufrufen, dann sieht man das Fenster nicht. Aber ist das nicht totaler overhead ? Das Fenster ist schließlich noch da, der Handle ist dem Fenster noch zu gewiesen, irgendwo OS-Intern wird das Fenster noch verwaltet, etc. . Also was soll ich machen um das fenster zu ZERSTÖREN ? Ich will es im Verlauf des Programmes nicht mehr haben, es wird nicht mehr benötigt.
Ist die richtige Alternative für die darauffolgenden GUI-Elemente dieses Fenster einfach weiter zu verwenden ?! Das wäre theoretisch möglich, aber sehr umständlich. Es hilft auch nicht, wenn man mehrere verschiedene Fenster gleichzeitg braucht und dann irgendwann nicht mehr.
Also was ist des Rätsels Lösung ? Sorry, wenn das eigentlich offensichtlich ist - aber ich stehe echt dermaßen auf dem Schlauch.
Vielen Dank schon mal und schönen Abend noch !
-
Ich versteh dein Problem nicht. Das PostQuitMessage() im WM_DESTROY Handler steht ja eben da, damit der Prozess beendet, wenn das Fenster zerstört wird. Wenn du nicht willst, dass der Prozess beendet (bzw. eben die Nachrichtenschleife abbricht), wenn das Fenster geschlossen wird, dann schreib eben kein PostQuitMessage() hin!?
-
YeaYea schrieb:
Die Beendigung des Prozesses kommt daher, dass irgendwo in der Callback function zu dem entsprechenden Fenster :
case WM_DESTROY : PostQuitMessage(0); breakM
steht.
Jo, und deshalb steht das sinnvollerweise auch nur in der Fensterprozedur für das Hauptfenster.
YeaYea schrieb:
Wenn ich den case-branch rausnehme passiert bei einem zB DestroyWindow() call gar nichts.
Na, da steht aber in der MSDN was ganz anderes:
http://msdn.microsoft.com/de-de/library/windows/desktop/ms632682(v=vs.85).aspx
-
Türlich funzt DestroyWindow(), muss aber aus demselben thread aufgerufen werden, der das Fenster erzeugt hat.
-
Oh Gott, dann hab ich DestroyWindow() total missverstanden.
Ich dachte die Arbeitsweise der Funktion besteht darin, dass sie eine WM_DESTROY Message an das entsprechende Fenster schickt und dort geschieht dann, was geschehen soll. Ich dachte also, dass dann in der Callback funktion des Fensters "die Magie" passiert, die zum Verschwinden des Fenster führt.
Jetzt steh ich natürlich total blöd da
Aber mein Problem ist gelöst, also vielen Dank an alle Beteiligten !
-
Bei vielen Funktionen ist es ja auch so. Da passiert dann entsprechend nix wenn man die Message nicht an die DefWindowProc weiterleitet.
Bei WM_DESTROY ist es halt nicht so. Steht aber auch in der DokuMSDN - WM_DESTROY schrieb:
Sent when a window is being destroyed. It is sent to the window procedure of the window being destroyed after the window is removed from the screen....
Da DestroyWindow die "delete Funktion" für Fenster ist muss es im Prinzip auch so sein. Sonst könnte man ja "unlöschbare" Fenster/Controls bauen, was irgendwie komisch wäre.