PDA

Visualizza la versione completa : [C++] Problemi con DialogBoxParam


winterwake
05-10-2009, 21:17
Buonasera,
ho un problema probabilmente banale, ma non ne vengo a capo.

In sostanza ho un puntatore ad una classe che vorrei passare come lParam con il metodo DialogBoxParam, il codice Ŕ il seguente:



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(hWnd,GWLP_USERDATA));

switch (message)
{
............

case IDM_TROVA:
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_TROVA), hWnd, Trova, (LPARAM) r);
break;
..............


Ora, al momento di di recuperare il puntatore dentro la DialogProcedure Trova procedo in questo modo



INT_PTR CALLBACK Trova(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
int wmId, wmEvent;

Ricerca* r = reinterpret_cast<Ricerca*>lParam;


Ora se faccio r-> in effetti riesco ad accedere ad ogni variabile e metodo della classe, ma non appena scrivo qualcosa questo genera errore. Dal debug ho dedotto che quello che r dentro la DialogProcedure punta cose a caso in memoria (per per esempio mi dice r->i=... nonostante i sia un valore correttamente inizializzato e pi¨ volte acceduto prima della chiamata alla DialogBox).

Con ogni probabilitÓ sono io che non ho capito che si usa la DialogBoxParam, ma per quello che ho trovato su MSDN sono rimasto al punto di partenza...

Da notare che se non uso DialogBoxParam ma accedo in modo brutale al puntatore r


Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(GetParent(hDlg),GWLP_USERDATA));


Tutto funziona correttamente, ma questa soluzione non Ŕ quello che cerco.

Grazie a chiunque saprÓ darmi una mano.

MItaly
05-10-2009, 21:32
Il parametro passato a DialogBoxParam viene fornito via lParam solo nel messaggio WM_INITDIALOG; come farebbero altrimenti a funzionare tutti gli altri messaggi che forniscono altre informazioni via lParam? Devi quindi recuperarlo quando il dialog riceve WM_INITDIALOG, memorizzarlo da qualche altra parte (ad esempio, nello spazio userdata associato alla finestra) per poterlo utilizzare anche in seguito.

winterwake
05-10-2009, 21:50
Si, in effetti Ŕ sorprendentemente logico, grazie di tutto.... posto per completezza il codice corretto qualora qualcuno abbia il medesimo problema



case WM_INITDIALOG:
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lParam);
return (INT_PTR)TRUE;

..........

case IDOK:{
Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(hDlg,DWLP_USER));


Grazie Ancora!

MItaly
05-10-2009, 21:53
Prego, alla prossima! :ciauz:

Loading