Schließen des Fensters
Wenn der Benutzer ein Fenster schließt, löst diese Aktion eine Sequenz von Fenstermeldungen aus.
Der Benutzer kann ein Anwendungsfenster schließen, indem er auf die Schaltfläche Schließen klickt oder eine Tastenkombination wie ALT+F4 verwendet. Jede dieser Aktionen bewirkt, dass das Fenster eine WM_CLOSE Nachricht empfängt. Die WM_CLOSE Meldung gibt Ihnen die Möglichkeit, den Benutzer vor dem Schließen des Fensters zu fragen. Wenn Sie das Fenster wirklich schließen möchten, rufen Sie die Funktion DestroyWindow auf. Andernfalls geben Sie einfach null aus der WM_CLOSE-Nachricht zurück, und das Betriebssystem ignoriert die Nachricht und zerstört das Fenster nicht.
Hier ist ein Beispiel dafür, wie ein Programm mit WM_CLOSE umgehen kann.
case WM_CLOSE:
if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
{
DestroyWindow(hwnd);
}
// Else: User canceled. Do nothing.
return 0;
In diesem Beispiel zeigt die MessageBox-Funktion ein modales Dialogfeld an, das die Schaltflächen OK und Abbrechen enthält. Wenn der Benutzer auf OK klickt, ruft das Programm DestroyWindow auf. Andernfalls wird der Aufruf von DestroyWindow übersprungen, wenn der Benutzer auf Abbrechen klickt, und das Fenster bleibt geöffnet. Geben Sie in beiden Fällen null zurück, um anzugeben, dass Sie die Nachricht verarbeitet haben.
Wenn Sie das Fenster schließen möchten, ohne den Benutzer zu fragen, können Sie einfach DestroyWindow ohne den Aufruf von MessageBox aufrufen. In diesem Fall gibt es jedoch eine Verknüpfung. Denken Sie daran, dass DefWindowProc die Standardaktion für jede Fensternachricht ausführt. Im Fall von WM_CLOSE ruft DefWindowProc automatisch DestroyWindow auf. Das bedeutet, wenn Sie die meldung WM_CLOSE in Ihrer switch-Anweisung ignorieren, wird das Fenster standardmäßig zerstört.
Wenn ein Fenster zerstört werden soll, empfängt es eine WM_DESTROY Nachricht. Diese Meldung wird gesendet, nachdem das Fenster vom Bildschirm entfernt wurde, aber bevor die Zerstörung eintritt (insbesondere bevor untergeordnete Fenster zerstört werden).
In Ihrem Standard Anwendungsfenster antworten Sie in der Regel auf WM_DESTROY, indem Sie PostQuitMessage aufrufen.
case WM_DESTROY:
PostQuitMessage(0);
return 0;
Wir haben im Abschnitt Fensternachrichten gesehen, dass PostQuitMessage eine WM_QUIT Nachricht in die Nachrichtenwarteschlange einfügt, wodurch die Nachrichtenschleife beendet wurde.
Im Folgenden finden Sie ein Flussdiagramm, das die typische Methode zum Verarbeiten von WM_CLOSE und WM_DESTROY-Nachrichten zeigt:
Nächste
Managing Application State (Verwalten eines Anwendungszustands)