[C con Clase] Problemas con cuadros de dialogo

Salvador Pozo salvador en conclase.net
Lun Ene 7 10:47:51 CET 2008


El pasado 2008-01-07 05:12:38, Kyosuke Kasuga escribió:
 
KK> Hi!!!, Yo otra vez, el problema que tengo ahora es muy raro, me compila y linkea todo bien, se ejecuta el programa y me aparece el menú, pero cuando selecciono una opción, el cuadro de dialogo que llamo, me aparece sin la ventana, es decir solo me aparecen los controles como flotando en la pantalla, y mas encima se queda pegado, ya revise el codigo y no encuentro ningún error, asi que he pensado que a lo mejor me falta agregar algo por los nuevos controles (Listview y Data timer picker), adjunto el proyecto por si alguien tiene tiempo de echarle una miradita y decirme cual es mi error, se los agradeceria mucho.

Hola:

Hay que tener cuidado con los valores de retorno de las funciones.

En tu caso, si nos fijamos, los procedimientos de diálogo tienen que retornar un valor BOOL. Para el sistema, el valor de retorno tiene un significado importante. 

http://winapi.conclase.net/curso/index.php?fun=DialogProc

Según la documentación del API:
"Excepto en la respuesta al mensaje WM_INITDIALOG, el procedimiento de diálogo debe retornar con un valor no nulo si procesa el mensaje y cero si no lo hace. Cuando responde a un mensaje WM_INITDIALOG, el procedimiento debe retornar cero si llama a la función SetFocus para poner el foco a uno de los controles del cuadro de diálogo. En otro caso, debe retornar un valor distinto de cero, en ese caso el sistema pondrá el foco en el primer control del diálogo que pueda recibirlo."

Un valor verdadero (TRUE) indica que el procedimiento ha procesado el mensaje, y no se necesita que el sistema haga nada más al respecto.

Esto es lo que está pasando en tu programa con la mayoría de los mensajes (todos menos el WM_COMMAND para casos como el botón de aceptar y cancelar). De modo que el sistema no procesa, por ejemplo, el mensaje WM_PAINT o WM_NCPAINT, y por eso los controles aparecen "flotando".

En general, bastará con añadir una línea return FALSE; al final de la función, para todos los casos que no estén previstos en el switch que procesa los mensajes recibidos.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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