Udostępnij przez


Zamykanie okna

Gdy użytkownik zamknie okno, ta akcja wyzwala sekwencję komunikatów okna.

Użytkownik może zamknąć okno aplikacji, klikając przycisk Zamknij lub za pomocą skrótu klawiaturowego, takiego jak ALT+F4. Każda z tych akcji powoduje, że okno otrzyma komunikat WM_CLOSE. Komunikat WM_CLOSE umożliwia wyświetlenie monitu dla użytkownika przed zamknięciem okna. Jeśli naprawdę chcesz zamknąć okno, wywołaj funkcję DestroyWindow. W przeciwnym razie wystarczy zwrócić zero z komunikatu WM_CLOSE, wtedy system operacyjny zignoruje ten komunikat i nie zniszczy okna.

Oto przykład, jak program mógłby obsługiwać WM_CLOSE.

case WM_CLOSE:
    if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
    {
        DestroyWindow(hwnd);
    }
    // Else: User canceled. Do nothing.
    return 0;

W tym przykładzie funkcja MessageBox wyświetla modalne okno dialogowe zawierające przyciski OK i Anuluj. Jeśli użytkownik kliknie przycisk OK, program wywołuje DestroyWindow. W przeciwnym razie, jeśli użytkownik kliknie Anuluj, wywołanie DestroyWindow zostanie pominięte, a okno pozostanie otwarte. W obu przypadkach zwróć zero, aby wskazać, że komunikat został obsłużony.

Jeśli chcesz zamknąć okno bez monitowania użytkownika, możesz po prostu wywołać DestroyWindow bez wywołania MessageBox. Jednak w tym przypadku istnieje skrót. Pamiętaj, że DefWindowProc wykonuje domyślną akcję dla dowolnego komunikatu okna. W przypadku WM_CLOSEDefWindowProc automatycznie wywołuje DestroyWindow. Oznacza to, że jeśli zignoruj komunikat WM_CLOSE w instrukcji switch, okno zostanie domyślnie zniszczone.

Gdy okno zostanie zniszczone, otrzyma komunikat WM_DESTROY. Ta wiadomość jest wysyłana po usunięciu okna z ekranu, ale zanim zajdzie proces niszczenia (w szczególności zanim zostaną zniszczone okna podrzędne).

W głównym oknie aplikacji zazwyczaj odpowiadasz na WM_DESTROY, wywołując PostQuitMessage.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

Widzieliśmy w sekcji Komunikaty okien, że PostQuitMessage umieszcza komunikat WM_QUIT na kolejce komunikatów, powodując zakończenie pętli komunikatów.

Oto wykres blokowy przedstawiający typowy sposób przetwarzania komunikatów WM_CLOSE i WM_DESTROY:

wykres blokowy przedstawiający sposób obsługi komunikatów wm-close i wm-destroy

Następny

zarządzanie stanem aplikacji