[C con Clase] API

Steven Davidson steven en conclase.net
Mie Jun 20 20:20:08 CEST 2007


Hola Sebastián,

El pasado 2007-06-20 13:01:21, sebastian escribió:

s> Hola, tengo una nueva pregunta, que diferencia hay entre agregar un 
s> control directamente en la funcion winapi y agregarlo en el mensaje de 
s> WM_CREATE?

Creo que te refieres a 'WinMain()' cuando dices "winapi".

Cuando creas la ventana principal con 'CreateWindowEx()', ésta envía como mínimo el mensaje 'WM_CREATE'. Hasta que no regrese de este mensaje y posiblemente otros, la función 'CreateWindowEx()' sigue siendo invocada y por tanto nos quedamos "detenidos" en la función 'WinMain()'.

Por rapidez, supongo que puedes crear los controles en 'WM_CREATE', ya que este mensaje es enviado por 'CreateWindowEx()'. Además, al tener los controles ya creados, la ventana tiene toda la información necesaria cuando llegue el momento de dibujar tanto su propia ventana como las de sus hijas - los controles.

Hoy en día los PC's son muy rápidos, y seguramente no notarás gran diferencia entre un método u otro. También supongo que si quieres modificar algún aspecto de los controles, puedes hacerlo antes de que se muestren, si lo hacemos en 'WM_CREATE'. Por último, la razón que creo que nos interesa más es la organización al programar nuestra aplicación. Típicamente, no nos salimos de la norma al crear la función 'WinMain()', lo cual conlleva a concentrarnos en implementar la gran mayoría de las tareas - por no decir todas - en el procedimiento de ventana 'WindowProc()'.

s> Visualmente es igual, pero cuando lo agrego en winapi despues no se como 
s> pasarle parametros para modificarle cualqueir cosa al control, mientras 
s> que si lo defino en el mensaje, como esta en los ejemplos si se puede. 
s> Pero quiza tambien se pueda hacer lo mismo cuando se agrega desde el 
s> winapi, pero no se como......

Esto depende de los ejemplos que has visto al igual que los capítulos que has leído. En general, no hay grandes diferencias al controlar los controles, valga la redundancia, dentro del procedimiento de ventana como dentro de 'WinMain()'.

Modificar un control implica enviar mensajes a tal ventana. Esto se puede hacer con 'SendMessage()' o si no quieres ser tan sincronizado, puedes usar 'PostMessage()'. Sin embargo, necesitas un manipulador de ventana (HWND) como parámetro. Si no tienes aael manipulador, pero sí su ID, entonces puedes usar la función 'SendDlgItemMessage()'. Obviamente, necesitas el manipulador de la ventana pariente. Estas funciones se pueden invocar tanto dentro de 'WinMain()' como en 'WindowProc()'.


Espero haber aclarado las dudas.

Steven


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