Win32 Callback als NICHT-Statische Elementfunktion
-
keine Ahnug aber irgenwie bin ich unfähig.
habs jetz so eingebaut wie es net gesagt hat:
CALLBACK CDialog::RohDialogProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static bool flag = false; CDialog* wnd; LPCREATESTRUCT lcs; wnd = (CDialog*)GetWindowLong(hWnd,GWL_USERDATA); if(message ==WM_INITDIALOG) wnd = (CDialog*)(lcs->lpCreateParams); flag = true; if(flag == false) { return FALSE; } else { lcs = (LPCREATESTRUCT)lParam; SetWindowLong(hWnd,GWL_USERDATA,(long)wnd); return wnd->DialogProc(hWnd,message,wParam,lParam); } }
aber nun kackt es wieder ab sobald die Dialogbox erstellt worden ist...
woran kann das liegen???gruss reima
-
der zeiger steht in LPARAM.
-
reima schreib den code nochmal komplett neu.
-
@reima
Mach den Vorschlag von net wieder raus, das ist absoluter Unsinn. Dieses "Flag" hast du ja schon mit GWL_USERDATA. Benutze übrigens GetWindowLongPtr/SetWindowLongPtr/GWLP_USERDATA statt GetWindowLong/SetWindowLong/GWL_USERDATA, falls GWL_USERDATA ein Zeiger ist (was bei dir der Fall ist).Ansonsten würde ich es erstmal mit folgender Funktion probieren
CALLBACK CDialog::RohDialogProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { CDialog* wnd = (CDialog*)GetWindowLong(hWnd,GWL_USERDATA); switch(message) { case WM_INITDIALOG: wnd = (CDialog*)((CREATESTRUCT*)lParam)->lpCreateParams; SetWindowLong(hWnd,GWL_USERDATA,(long)wnd); break; } if (wnd) return wnd->DialogProc(hWnd,message,wParam,lParam); else return FALSE; }
edit:
Man sollte halt nicht soviel copy&pasten ohne nachzudenken.
-
DefDlgProc darf man nicht dort aufrufen.
-
der zeiger steht in LPARAM.
ja:
hDlg = CreateDialogParam(hInst,MAKEINTRESOURCE(DialogNr),hWnd,RohDialogProc, (LPARAM)(this));
habs jetzt mal so eingebaut, inkl GetWindowLongPtr / SetWindowLongPtr / GWLP_USERDATA. aber es ist kommisch sobald MW_INITDIALOG 1x aufgerufen worden ist "wnd" immer "leer" d.h auf null, somit werden auch keine daten gesendet, warum das?
danke im voraus
gruss reima
-
#include <hirn.h>
-
reima schrieb:
habs jetzt mal so eingebaut, inkl GetWindowLongPtr / SetWindowLongPtr / GWLP_USERDATA. aber es ist kommisch sobald MW_INITDIALOG 1x aufgerufen worden ist "wnd" immer "leer" d.h auf null, somit werden auch keine daten gesendet, warum das?
Schau dir mal WM_INITDIALOG in MSDN an, und speziell, was es mit lParam auf sich hat. Ich glaube, du verwechselst da was mit WM_CREATE.
-
groovemaster schrieb:
reima schrieb:
habs jetzt mal so eingebaut, inkl GetWindowLongPtr / SetWindowLongPtr / GWLP_USERDATA. aber es ist kommisch sobald MW_INITDIALOG 1x aufgerufen worden ist "wnd" immer "leer" d.h auf null, somit werden auch keine daten gesendet, warum das?
Schau dir mal WM_INITDIALOG in MSDN an, und speziell, was es mit lParam auf sich hat. Ich glaube, du verwechselst da was mit WM_CREATE.
Mann sol laut Msdn alles Dort initialisieren...
und in lParam sind daten zum erstellen der Dialogbox drin, das lösst aber immer noch nicht mein problem -> entweder stürtz es ab oder reagiert gar nicht....nach WM_INITDIALOG kommen immer nur "leere" nachrichten rein, respektive es werde n gar keine mehr abgefangen, warum?
gruss reima
-
reima schrieb:
und in lParam sind daten zum erstellen der Dialogbox drin
Und ist denn in lParam ein Zeiger auf eine CREATESTRUCT Instanz? Oder doch nur 1:1 das, was du bei CreateDialogParam angegeben hast?