[C con Clase] Hilo del WM_QUIT

Steven Davidson srd4121 en njit.edu
Jue Jul 17 23:17:28 CEST 2008


Hola Juan,

Juan wrote:
> he seguido el hilo del WM_QUIT y tambien tengo mis dudas.
> Con un bucle de mensajes como este:
>     MSG Msg;    //a simple structure for storing message information
>     //start message loop
>     while (GetMessage(&Msg,NULL,0,0))
>         {
>         TranslateMessage(&Msg);
>         DispatchMessage(&Msg);
>         }
>     return Msg.wParam;
> Con un PostQuitMessage(0); sales del programa sin recibir un
> WM_DESTROY ni un WM_CLOSE ni recibes en el procedimiento de ventana
> el WM_QUIT, porqué supongo que no llega porque se pierde en el bucle
> de mensajes. Si sales pulsando la X de la aplicación, puedes
> interceptar el WM_CLOSE o el WM_DESTROY, o ambos a la vez y lanzar un
> PostQuitMessage(0); y sales. Si lanzas un DestroyWindow(hwnd) recibes
> un WM_DESTROY.
> Supongo que si tienes una aplicación abierta, en WM_CLOSE es buen
> momento para decidir si salir o no del programa, aunque en WM_DESTROY
> aún estás a tiempo de echarte atrás no? Cuando y como en el

Sí, pero ten en cuenta que una vez que obtengamos el mensaje 
'WM_DESTROY', la ventana ya ha sido eliminada. Típicamente, este mensaje 
nos sirve para eliminar memoria y otros recursos, guardar información, y 
cualquier otra tarea que se nos ocurra antes de terminar. Puedes pensar 
que 'WM_DESTROY' se asemeja a un destructor en la POO.

> procedimiento de ventana puedes interceptar el WM_QUIT... Supongo que
> tendré algún programa que lo haga, pero ahora mismo no lo encuentro,
> y tampoco me hace falta, solo es curiosidad.

No puedes procesar el mensaje 'WM_QUIT' en el procedimiento de ventana, 
al menos que lo envíe tu aplicación internamente saltándose la cola de 
mensajes. Lo que sí puedes hacer es conseguir el mensaje en 'WinMain()'. 
Por ejemplo,

bool bRepetir = true;

while( bRepetir )
   if( -1 == GetMessage(...) )
   {
     // Error!
     ...
     bRepetir = false;
   }
   else if( WM_QUIT == msg.message )
   {
     // Terminamos
     ...
     bRepetir = false;
   }
   else
   {
     // Tenemos mensajes que procesar
     ...
   }

No estoy seguro de por qué quieres ser explícito con el mensaje 
'WM_QUIT', pero puedes hacerlo.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase