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 :