Cerrar la ventana
Cuando el usuario cierra una ventana, esa acción desencadena una secuencia de mensajes de ventana.
El usuario puede cerrar una ventana de la aplicación haciendo clic en el botón Cerrar o usando un método abreviado de teclado como ALT+F4. Cualquiera de estas acciones hace que la ventana reciba un mensaje de WM_CLOSE . El mensaje WM_CLOSE le ofrece la oportunidad de pedir al usuario antes de cerrar la ventana. Si realmente desea cerrar la ventana, llame a la función DestroyWindow . De lo contrario, simplemente devuelve cero del mensaje WM_CLOSE y el sistema operativo omitirá el mensaje y no destruirá la ventana.
Este es un ejemplo de cómo un programa puede controlar 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;
En este ejemplo, la función MessageBox muestra un cuadro de diálogo modal que contiene botones Aceptar y Cancelar . Si el usuario hace clic en Aceptar, el programa llama a DestroyWindow. De lo contrario, si el usuario hace clic en Cancelar, se omite la llamada a DestroyWindow y la ventana permanece abierta. En cualquier caso, devuelva cero para indicar que ha controlado el mensaje.
Si desea cerrar la ventana sin preguntar al usuario, simplemente podría llamar a DestroyWindow sin la llamada a MessageBox. Sin embargo, hay un acceso directo en este caso. Recuerde que DefWindowProc ejecuta la acción predeterminada para cualquier mensaje de ventana. En el caso de WM_CLOSE, DefWindowProc llama automáticamente a DestroyWindow. Esto significa que si omite el mensaje de WM_CLOSE en la instrucción switch , la ventana se destruye de forma predeterminada.
Cuando una ventana está a punto de destruirse, recibe un mensaje de WM_DESTROY . Este mensaje se envía después de quitar la ventana de la pantalla, pero antes de que se produzca la destrucción (en particular, antes de que se destruya cualquier ventana secundaria).
En la ventana principal de la aplicación, normalmente responderá a WM_DESTROY llamando a PostQuitMessage.
case WM_DESTROY:
PostQuitMessage(0);
return 0;
Hemos visto en la sección Mensajes de ventana que PostQuitMessage coloca un mensaje WM_QUIT en la cola de mensajes, lo que hace que el bucle del mensaje finalice.
Este es un gráfico de flujo que muestra la manera típica de procesar WM_CLOSE y WM_DESTROY mensajes: