[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