Chiusura della finestra

Quando l'utente chiude una finestra, tale azione attiva una sequenza di messaggi della finestra.

L'utente può chiudere una finestra dell'applicazione facendo clic sul pulsante Chiudi oppure usando una scelta rapida da tastiera, ad esempio ALT+F4. Una di queste azioni fa sì che la finestra riceva un messaggio WM_CLOSE . Il messaggio WM_CLOSE consente di richiedere all'utente di chiudere la finestra. Se si vuole davvero chiudere la finestra, chiamare la funzione DestroyWindow . In caso contrario, è sufficiente restituire zero dal messaggio WM_CLOSE e il sistema operativo ignorerà il messaggio e non eliminerà definitivamente la finestra.

Ecco un esempio di come un programma può gestire 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;

In questo esempio la funzione MessageBox mostra una finestra di dialogo modale contenente i pulsanti OK e Annulla . Se l'utente fa clic su OK, il programma chiama DestroyWindow. In caso contrario, se l'utente fa clic su Annulla, la chiamata a DestroyWindow viene ignorata e la finestra rimane aperta. In entrambi i casi, restituire zero per indicare che il messaggio è stato gestito.

Se vuoi chiudere la finestra senza chiedere conferma all'utente, puoi semplicemente chiamare DestroyWindow senza la chiamata a MessageBox. In questo caso, tuttavia, esiste un collegamento. Tenere presente che DefWindowProc esegue l'azione predefinita per qualsiasi messaggio della finestra. Nel caso di WM_CLOSE, DefWindowProc chiama automaticamente DestroyWindow. Ciò significa che se si ignora il messaggio di WM_CLOSE nell'istruzione switch , la finestra viene eliminata definitivamente per impostazione predefinita.

Quando una finestra sta per essere eliminata definitivamente, riceve un messaggio WM_DESTROY . Questo messaggio viene inviato dopo la rimozione della finestra dallo schermo, ma prima che si verifichi la distruzione (in particolare, prima che tutte le finestre figlio vengano eliminate definitivamente).

Nella finestra principale dell'applicazione si risponderà in genere alle WM_DESTROY chiamando PostQuitMessage.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

Nella sezione Messaggi finestra è stato visualizzato che PostQuitMessage inserisce un messaggio WM_QUIT nella coda dei messaggi, causando la fine del ciclo di messaggi.

Di seguito è riportato un grafico di flusso che mostra il modo tipico per elaborare WM_CLOSE e WM_DESTROY messaggi:

diagramma di flusso che mostra come gestire i messaggi wm-close e wm-destroy

Prossima

Gestione dello stato di un'applicazione