[C con Clase] Cargar un Dialogo antes de entrar al menú
Steven Davidson
srd4121 en njit.edu
Jue Sep 11 20:27:36 CEST 2008
Hola Juan Antonio,
Juan Antonio Rubio wrote:
> Hola a todos,
>
> Me encuentro con un problema que quiza sea de concepto. Me gustaria
> arrancar un cuadro de dialogo inmediatamente después de haber
> mostrado la ventana principal de la aplicación. Lo he intentado con
> la funcion DialogBoxParam en WM_CREATE, pero es un proceso que
> realiza ANTES de mostrar la ventana.
>
> El objeto es poder introducir datos (Configuración, Contraseñas,...)
> inmediatamente después de arrancar el programa y antes de que pueda
> acceder a las opciones de menú.
>
Tendrás que decidir cuándo la ventana haya entrado en el estado de
"arrancado". Sospecho que quieres que la ventana en sí exista
visualmente. Esto implicaría que se ha enviado y procesado el mensaje
WM_PAINT. Sugiero forzar mostrar la ventana con 'ShowWindow()' y luego
invoca 'UpdateWindow()' para enviar el primer mensaje 'WM_PAINT'. Esto
implica que no deberías usar el estilo 'WS_VISIBLE'. Por ejemplo,
hwnd = CreateWindowEx( ... );
while( PeekMessage( &msg, hwnd, 0, 0, PM_REMOVE ) )
{
...
}
// No hay más mensajes => Muestra la ventana
ShowWindow( hwnd, SW_SHOWNORMAL );
UpdateWindow( hwnd ); // => WM_PAINT enviado directamente
// Crea el cuadro de diálogo
DialogBox( ... );
// Bucle normal
while( GetMessage(...) == TRUE )
{
...
}
Esto no es una sincronización perfecta, pero quizá te sirva. Otra
manera, es simplemente agregar alguna variable booleana para indicar si
hemos procesado el mensaje 'WM_PAINT' por primera vez o no. Una mejora
es crear tu propio mensaje de notificación. Por ejemplo,
#define WM_CREADIALOGO WM_APP
...
hwnd = CreateWindowEx( ... ); // con WS_VISIBLE
SendMessage( hwnd, WM_CREADIALOGO, 0, 0 );
// Bucle normal
while( GetMessage(...) == TRUE )
{
...
}
...
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
static bool bPrimeraVez = false;
...
case WM_PAINT:
if( !bPrimeraVez ) bPrimeraVez = true;
else
{
...
}
break;
case WM_CREADIALOGO:
DialogBox( ... );
break;
...
}
Espero que todo esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase