it-swarm.com.de

Was ist der Unterschied zwischen WM_QUIT, WM_CLOSE und WM_DESTROY in einem Windows-Programm?

Ich habe mich gefragt, was der Unterschied zwischen den Meldungen WM_QUIT, WM_CLOSE und WM_DESTROY in einem Windows-Programm ist: Wann werden sie gesendet und haben sie außer den vom Programm definierten automatische Auswirkungen?

62
user98188

Sie sind total unterschiedlich.

WM_CLOSE Wird an das Fenster gesendet, wenn "X" gedrückt oder "Close" aus dem Fenstermenü ausgewählt wird. Wenn Sie diese Meldung abfangen, ist dies Ihr Aufruf, wie Sie sie behandeln sollen - ignorieren Sie sie oder schließen Sie das Fenster wirklich. Standardmäßig bewirkt WM_CLOSE, Das an DefWindowProc übergeben wird, dass das Fenster zerstört wird. Wenn das Fenster zerstört wird, wird die Nachricht WM_DESTROY Gesendet. In dieser Phase können Sie im Gegensatz zu WM_CLOSE Den Prozess nicht stoppen, sondern nur eine notwendige Bereinigung vornehmen. Denken Sie jedoch daran, dass Sie WM_DESTROY Abfangen, bevor alle untergeordneten Fenster bereits zerstört sind. WM_NCDESTROY Wird gesendet, sobald alle untergeordneten Fenster zerstört wurden.

Die Meldung WM_QUIT Bezieht sich nicht auf ein Fenster (das hwnd, das von GetMessage abgerufen wurde, ist NULL und es wird keine Fensterprozedur aufgerufen). Diese Nachricht gibt an, dass die Nachrichtenschleife gestoppt und die Anwendung geschlossen werden soll. Wenn GetMessageWM_QUIT Liest, wird 0 zurückgegeben, um dies anzuzeigen. Schauen Sie sich das typische Nachrichtenschleifen-Snippet an - die Schleife wird fortgesetzt, während GetMessage ungleich Null zurückgibt. WM_QUIT Kann mit der Funktion PostQuitMessage gesendet werden. Diese Funktion wird normalerweise aufgerufen, wenn das Hauptfenster WM_DESTROY Empfängt (siehe typisches Fensterprozedur-Snippet ).

80
adf88

Zunächst werden die Nachrichten WM_CLOSE und WM_DESTROY bestimmten Fenstern zugeordnet, wohingegen die Nachricht WM_QUIT für die gesamte Anwendung (Well Thread) und gilt Die Nachricht wird niemals über eine Fensterprozedur (WndProc -Routine) empfangen, sondern nur über die Funktionen GetMessage oder PeekMessage.

In Ihrer WndProc Routine kümmert sich die DefWindowProc Funktion um das Standardverhalten dieser Nachrichten. In den Nachrichten WM_CLOSE wird das Schließen der Anwendung angefordert, und das Standardverhalten besteht darin, die Funktion DestroyWindow aufzurufen. Wenn diese Funktion DestroyWindow aufgerufen wird, wird die Nachricht WM_DESTROY gesendet. Beachten Sie, dass WM_CLOSE nur eine Meldung ist, die Sie zum Schließen auffordert (wie WM_QUIT ) - Sie müssen das Programm eigentlich nicht beenden. Die Meldung WM_DESTROY informiert Sie jedoch darüber, dass Ihr Fenster [~ # ~] [~ # ~] geschlossen und zerstört wird Sie müssen alle Ressourcen, Handles usw. bereinigen.

10
user353297

Nur damit es nicht in den Kommentaren verloren geht ... vergiss nicht WM_CANCEL. Wenn Sie in einem MFC-Dialogfeld auf die Schaltfläche zum Schließen (x) klicken, wird mit Sicherheit WM_CLOSE Gesendet. Die Standardfunktion OnClose() ruft dann die Standardfunktion (Basisklasse) OnCancel() auf.

Wenn Sie jedoch einfach die Taste ESC eingeben, wird der Dialog geschlossen, aber (soweit ich das beurteilen kann) ohne das Ereignis WM_CLOSE Zu generieren WM_CANCEL/OnCancel() Mechanismus.

Hiermit lade ich die Community ein, dies zu erläutern ... oder diese Ausarbeitung in die akzeptierte Antwort zu ändern.

4
omatai

Erörtern wir zuerst WM_QUIT - den Unterschied zu anderen Nachrichten, die nicht mit window verknüpft sind. Es wird von der Anwendung verwendet. Dies kann zum Beispiel von einem nicht sichtbaren eigenständigen OLE server (.exe, aber nicht in-proc als .dll) erledigt werden.

WM_CLOSE - per msdn: "Eine Anwendung kann den Benutzer zur Bestätigung auffordern, bevor ein Fenster zerstört wird" - wird als Benachrichtigung über die Absicht zum Schließen verwendet (Sie können diese Absicht ablehnen).

WM_DESTROY - ist eine Tatsache, dass das Fenster geschlossen wird und alle Ressourcen (!) Freigegeben werden müssen.

2
Dewfy