Compartilhar via


Fechando a janela

Quando o usuário fecha uma janela, essa ação dispara uma sequência de mensagens de janela.

O usuário pode fechar uma janela do aplicativo clicando no botão Fechar ou usando um atalho de teclado, como ALT+F4. Qualquer uma dessas ações faz com que a janela receba uma mensagem WM_CLOSE . A mensagem WM_CLOSE oferece a oportunidade de solicitar ao usuário antes de fechar a janela. Se você realmente quiser fechar a janela, chame a função DestroyWindow . Caso contrário, basta retornar zero da mensagem WM_CLOSE e o sistema operacional ignorará a mensagem e não destruirá a janela.

Aqui está um exemplo de como um programa pode lidar com 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;

Neste exemplo, a função MessageBox mostra uma caixa de diálogo modal que contém os botões OK e Cancelar . Se o usuário clicar em OK, o programa chamará DestroyWindow. Caso contrário, se o usuário clicar em Cancelar, a chamada para DestroyWindow será ignorada e a janela permanecerá aberta. Em ambos os casos, retorne zero para indicar que você lidou com a mensagem.

Se você quiser fechar a janela sem avisar o usuário, basta chamar DestroyWindow sem a chamada para MessageBox. No entanto, há um atalho nesse caso. Lembre-se de que DefWindowProc executa a ação padrão para qualquer mensagem de janela. No caso de WM_CLOSE, DefWindowProc chama automaticamente DestroyWindow. Isso significa que, se você ignorar a mensagem WM_CLOSE na instrução switch , a janela será destruída por padrão.

Quando uma janela está prestes a ser destruída, ela recebe uma mensagem WM_DESTROY . Essa mensagem é enviada depois que a janela é removida da tela, mas antes que a destruição ocorra (em particular, antes que qualquer janela filho seja destruída).

Na janela do aplicativo main, você normalmente responderá a WM_DESTROY chamando PostQuitMessage.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

Vimos na seção Mensagens de Janela que PostQuitMessage coloca uma mensagem WM_QUIT na fila de mensagens, fazendo com que o loop de mensagem termine.

Aqui está um fluxograma mostrando a maneira típica de processar mensagens WM_CLOSE e WM_DESTROY :

fluxograma mostrando como lidar com mensagens wm-close e wm-destroy

Avançar

Gerenciando o estado do aplicativo