[C con Clase] Parámetros de WM QUIT y PostQuitMessage() en WinAPI

Steven Davidson srd4121 en njit.edu
Jue Jul 17 19:21:46 CEST 2008


Hola David,

David Reza wrote:
> 
>     Insisto en que la documentación de los mensajes no se debe
>     interpretar literalmente como código C. Podríamos haber documentado
>     el mensaje de igual forma:
> 
>     WM_QUIT
>      CodigoSalida = (int) wParam;
> 
> 
> No entiendo a dónde quieres llegar con ésto.
>  
> 

Lo que está diciendo Salvador es que lo de 'nExitCode' es un nombre 
arbitrario. Podemos elegir otro nombre cualquiera a la hora de manipular 
'wParam' correctamente.

>     Esto sólo indica que cuando se recibe un mensaje WM_QUIT, el valor
>     del parámetro wParam debe interpretarse como el código de salida.
> 
> 
> Si el valor del parámetro 'wParam' debe interpretarse cómo el código
> de salida, y el código de salida se pasó por parámetro a la función 
> 'PostQuitMessage', creo que debería existir en algún lado dentro de
> la definición de ésta función un código como éste:
> 
> variableMSG.wParam = nExitCode;
> 

Cierto. Sin embargo, esta asignación es implícita en la descripción de 
'PostQuitMessage()' a través del mensaje 'WM_QUIT'. Si miras la 
descripción del mensaje 'WM_QUIT' verás la forma en que usaríamos 'wParam'.

>     Análogamente, si enviamos el mensaje WM_QUIT usando una función más
>     genérica, como PostMessage, nos indica que debemos colocar el valor
>     de salida en el parámetro wParam.
> 
>     En realidad, PostQuitMessage se puede sustituir por PostMessage:
> 
>     VOID PostQuitMessage(int nExitCode) {
>       PostMessage(hWnd, WM_QUIT, nExitCode, 0);
>     }
> 
>  
> Como tú dices, debemos colocar el valor de salida en el parámetro 
> 'wParam', lo cual para mí indicaría una asignación implícita:
> 
> wParam = nExitCode
> 

Exacto. Esta asignación es implícita e interna en la función 
'PostQuitMessage()'. Por eso la descripción de esta función no se 
adentra en la parte interna de esta función. Simplemente esto no viene 
al caso, porque no interesa saber su implementación sino su uso y su 
función en sí.

> Por eso es que me confunde que ustedes me digan
> 
> nExitCode = (int) wParam;
> 
> Sinceramente no logro entender, y empiezo a pensar que puede ser
> tedioso hacerme entender algo de lo que todavía no me doy cuenta.
> 
> Lamentablemente soy una persona que cuando no entiende algo, me quedo 
> trabado en ello hasta que le entiendo, para que el desconocimiento de 
> ese "algo" no perjudique mi aprendizaje en lo que resta del curso.
> 

Entiendo, pero sinceramente no veo desconocimiento alguno en lo que nos 
dices. El único problema que yo veo que tienes es en la presentación del 
mensaje 'WM_QUIT'. Dentro de este problema creo que tienes un jaleo en 
cuanto a los puntos de vista que hemos separado en la referencia del 
API. Tenemos dos puntos de vista; quizá dos "diseños":

1. Lo que hacen y cómo se usan las funciones, como 'PostQuitMessage()', y
2. Lo que hacen y cómo se usan los mensajes, como 'WM_QUIT'.

El diseño de la presentación de ambos conceptos se basa en la indepencia 
de cada uno. Es decir, el diseño de la descripción de 
'PostQuitMessage()' se hace de una forma sin tener en cuenta 'WM_QUIT', 
mientras que el diseño de la descripción de 'WM_QUIT' se hace de otra 
forma sin basarse en 'PostQuitMessage()'. Obviamente, estos dos 
"conceptos" están interrelacionados y por ello en la sección de 
"Observaciones" hablamos un poco más acerca del concepto a detallar.

En cuanto a la forma que describimos bajo 'WM_QUIT':

WM_QUIT
nExitCode = (int) wParam;

Esto nos sirve para USAR o PROCESAR 'WM_QUIT'. En tu caso, creo yo, 
estás intentando ver lo anterior de forma inversa: cómo se llegó a 
'wParam'. Esto NO es lo que pretendemos exponer en los mensajes, como 
'WM_QUIT'. Nos centramos más en el USO de 'WM_QUIT' y no en el código 
interno que conllevó a este mensaje.

En cuanto al uso de 'WM_QUIT' concierne, podríamos hacer lo siguiente en 
'WinMain()':

while( TRUE == GetMessage(&mensaje, 0, 0, 0) )
{
   TranslateMessage( &mensaje );
   DispatchMessage( &mensaje );
}

int nExitCode = (int)mensaje.wParam;

return nExitCode;


Creo que ahora puedes ver el uso de 'wParam' y cómo hemos aplicado la 
información descrita en 'WM_QUIT'. Obviamente, no escribiríamos código 
como lo anterior, porque es un malgasto de memoria crear otra variable 
en este caso.


Espero que esto aclare la duda acerca de todo esto.

Steven





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