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-Meldung empfängt. Die WM _ CLOSE-Meldung gibt Ihnen die Möglichkeit, den Benutzer vor dem Schließen des Fensters aufzufordern. Wenn Sie das Fenster wirklich schließen möchten, rufen Sie die DestroyWindow-Funktion auf. Andernfalls geben Sie einfach 0 (null) aus der WM _ CLOSE-Nachricht zurück, und das Betriebssystem ignoriert die Meldung und zerstört das Fenster nicht.

Im Folgenden finden Sie ein Beispiel dafür, wie ein Programm WM _ CLOSEbehandeln 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 DestroyWindowauf. Wenn der Benutzer andernfalls auf Abbrechen klickt, wird der Aufruf von DestroyWindow übersprungen, und das Fenster bleibt geöffnet. Geben Sie in beiden Fällen 0 (null) zurück, um anzugeben, dass Sie die Nachricht verarbeitet haben.

Wenn Sie das Fenster schließen möchten, ohne den Benutzer aufzufordern, können Sie DestroyWindow einfach ohne den Aufruf von MessageBoxaufrufen. In diesem Fall gibt es jedoch eine Verknüpfung. Denken Sie daran, dass DefWindowProc die Standardaktion für jede Fenstermeldung ausführt. Im Fall von WM _ CLOSEruft DefWindowProc automatisch DestroyWindow auf. Das bedeutet, dass das Fenster standardmäßig zerstört wird, wenn Sie die WM _ CLOSE-Meldung in Ihrer switch-Anweisung ignorieren.

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 erfolgt (insbesondere, bevor untergeordnete Fenster zerstört werden).

In Ihrem Hauptanwendungsfenster reagieren Sie in der Regel auf WM _ DESTROY, indem Sie PostQuitMessageaufrufen.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

Wir haben im Abschnitt Fenstermeldungen gesehen, dass PostQuitMessage eine WM _ QUIT-Nachricht in die Nachrichtenwarteschlange einfügt, wodurch die Nachrichtenschleife beendet wird.

Hier sehen Sie ein Flussdiagramm, das die typische Methode zum Verarbeiten von WM _ CLOSE- und WM _ DESTROY-Nachrichten zeigt:

Flussdiagramm, das zeigt, wie wm - close- und wm destroy-Meldungen behandelt werden -

Nächste

Managing Application State (Verwalten eines Anwendungszustands)