¿Cuál es la diferencia entre WM_QUIT, WM_CLOSE y WM_DESTROY en un progtwig de Windows?

Me preguntaba cuál es la diferencia entre los mensajes WM_QUIT, WM_CLOSE y WM_DESTROY en un progtwig de Windows, esencialmente: ¿cuándo se envían y tienen algún efecto automático además de lo que define el progtwig?

Ellos son totalmente diferentes.

WM_CLOSE se envía a la ventana cuando se presiona “X” o se elige “Cerrar” desde el menú de la ventana. Si captas este mensaje, esta es tu decisión sobre cómo tratarlo: ignóralo o cierra la ventana. De forma predeterminada, WM_CLOSE pasado a DefWindowProc hace que se destruya la ventana. Cuando se destruye la ventana, se WM_DESTROY mensaje WM_DESTROY . En esta etapa, en oposición a WM_CLOSE , no puede detener el proceso, solo puede realizar una limpieza necesaria. Pero recuerda que cuando capturas WM_DESTROY justo antes de que todas las ventanas WM_DESTROY ya estén destruidas. WM_NCDESTROY se envía justo después de que se hayan destruido todas las ventanas secundarias.

WM_QUIT mensaje WM_QUIT no está relacionado con ninguna ventana (el hwnd obtenido de GetMessage es NULL y no se llama a ningún procedimiento de ventana). Este mensaje indica que el ciclo de mensajes debe detenerse y la aplicación debe cerrarse. Cuando GetMessage lee WM_QUIT , devuelve 0 para indicar eso. Eche un vistazo al fragmento de bucle de mensaje típico : el bucle continúa mientras GetMessage devuelve un valor distinto de cero. WM_QUIT puede ser enviado por la función PostQuitMessage . Esta función se suele llamar cuando la ventana principal recibe WM_DESTROY (consulte el fragmento de procedimiento de ventana típico ).

En primer lugar, los mensajes WM_CLOSE y WM_DESTROY están asociados con ventanas particulares, mientras que el mensaje WM_QUIT es aplicable a toda la aplicación (hilo de pozo) y el mensaje nunca se recibe a través de un procedimiento de ventana (rutina WndProc ), sino solo a través de GetMessage o PeekMessage funciones.

En su rutina DefWindowProc función DefWindowProc se ocupa del comportamiento predeterminado de estos mensajes. Los mensajes WM_CLOSE solicitan que la aplicación se cierre y el comportamiento predeterminado para esto es llamar a la función DestroyWindow . Es cuando se llama a esta función DestroyWindow que se envía el mensaje WM_DESTROY . Tenga en cuenta que WM_CLOSE es solo un mensaje que le solicita que cierre (como WM_QUIT ); en realidad, no tiene que salir / salir. Pero el mensaje WM_DESTROY le dice que su ventana se está cerrando y destruyendo, por lo que debe limpiar todos los recursos, identificadores, etc.

Para que no se pierda en los comentarios … no te olvides de WM_CANCEL . Cuando hace clic en el botón de cerrar (x) en un cuadro de diálogo MFC, ciertamente enviará WM_CLOSE . La función predeterminada OnClose() llamará a la función OnCancel() predeterminada (clase base OnCancel() .

Sin embargo, si simplemente escribe la tecla ESC , esto dará lugar al cierre del diálogo, pero (hasta donde puedo decir) sin generar el evento WM_CLOSE – va directamente al WM_CANCEL/OnCancel() .

Por la presente, invito a la comunidad a profundizar en esto … o a editar esa elaboración en la respuesta aceptada.

Primero analicemos WM_QUIT – la diferencia de otros mensajes que esto no está asociado con la ventana. Es utilizado por la aplicación. Por ejemplo, esto puede ser manejado por un servidor OLE independiente no visible (.exe, pero no in-proc como .dll)

WM_CLOSE – por msdn: ” Una aplicación puede solicitar confirmación al usuario, antes de destruir una ventana ” – se usa como notificación de intención de cierre (puede rechazar esta intención).

WM_DESTROY: es un hecho que la ventana se está cerrando y todos los recursos deben (!) Estar desasignados.