[C con Clase] Pasar parámetros a un cuadro de diálogo, Windows API y C++

Steven Davidson srd4121 en njit.edu
Mar Sep 11 16:38:09 CEST 2012


Hola Víctor,

On 9/11/2012 7:15 AM, Víctor Caballero García wrote:
> Buenas a todos:
>
> Mi pregunta es sencilla. Quería saber si se podrían enviar más de un
> parámetro a un cuadro de diálogo y cómo. Conozco la función
> DialogBoxParam, pero no se como enviar varios parámetros.
>

El último parámetro de esta función sirve para pasar datos, de tipo 
'LPARAM', al procedimiento de diálogo a la hora de procesar el mensaje, 
'WM_INITDIALOG'. Si quieres pasar un dato que ocupe más de un 'LPARAM' o 
varios datos diferentes, entonces pasa un puntero a tal dato. Por ejemplo,

struct info_dialogo
{
   int nID;
   float fPrecio;
   string sNombre;
};
...
info_dialogo id = { 1234, 2.45f, "pimiento" };
int nRes = DialogBoxParam( hInstancia, "Dialogo", hWnd, DialogoProc, 
(LPARAM) &id );

Obviamente, el procedimiento de diálogo, 'DialogoProc()', tiene que 
realizar el cásting correcto para manipular los datos. Esto es,

BOOL CALLBACK DialogoProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM 
lParam )
{
   switch( msg )
   {
     case WM_INITDIALOG:
       info_dialogo *pid = (info_dialogo *)lParam;
     ...

     default:
       return FALSE;
   }

   return TRUE;
}

Seguramente querrás usar los datos obtenidos en 'WM_INITDIALOG' en el 
resto del procedimiento de diálogo. Una solución es creando una variable 
estática, como por ejemplo,

BOOL CALLBACK DialogoProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM 
lParam )
{
   static info_dialogo *pid;

   switch( msg )
   {
     case WM_INITDIALOG:
       pid = (info_dialogo *)lParam;
     ...
}

Sin embargo, una alternativa es usar los "datos de usuario" para una 
ventana. Esto involucra invocar 'SetWindowLongPtr()', que sirve tanto 
para las versiones de 32 bits como para las de 64 bits. Por ejemplo,

BOOL CALLBACK DialogoProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM 
lParam )
{
   info_dialogo *pid;

   if( WM_INITDIALOG == msg )
   {
     SetWindowLong( hDlg, GWL_USERDATA, lParam );
     ...
   }

   pid = (info_dialogo *) GetWindowLongPtr( hDlg, GWL_USERDATA );

   switch( msg )
   {
     ...
     case WM_DESTROY:
       SetWindowLongPtr( hDlg, GWL_USERDATA, 0 );
       ...
   }

   return TRUE;
}

Y como puedes ver, invocamos 'GetWindowLongPtr()' para recuperar esa 
información guardada.


Espero que todo esto te aclare las dudas.

Steven






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