[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