Win32 Callback als NICHT-Statische Elementfunktion
-
groovemaster schrieb:
gibts dann undefiniertes Verhalten. Ist jetzt nur so eine Idee. Du solltest aber mal testen, ob vor WM_INITDIALOG noch andere Messages kommen.
da kommen nicht nur 1-2 Nachrichten rein vor WM_INITDIALOG sondern ca. +100 Nachrichen, also ganz eine Menge, doch wie fange ich die am Besten ab?? Am besten wäre wenn ich von der funktion aus neue nachrichten anfordern lasse könnte, doch leider habe ich keine Ahung wie diese Funktion heisst(falls sie existiert)
dann könnte ich dies in einer While schleife überprüfen bis WM_INITDIALOG kommmtdanke für jede hilfe
gruss reima
-
gibt es keine Api Funktion mit welcher ich "Nachrichten" aus der DialogProc Anfordern kann, schlussendlich sollte die DialogProc solange auf nachrichten waren bis die Nachricht WM_INITDIALOG kommt, bin für jede Hilfe sehr dankbar
gruss james
-
if(wnd) { return wnd->DialogProc(hWnd,message,wParam,lParam); } else { return FALSE; }
oder so ähnlich
-
hmm extrem strange:
jetzt kommen die nachrichten überhaubt nicht mehr ( nur noch wm_initdialog)
Damit meine ich das keine Nachrichen mehr zur Funktion CheckMSG(UINT,WPARAM,LPARAM) gelangenCALLBACK CDialog::RohDialogProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static int x = 0; CDialog* wnd; LPCREATESTRUCT lcs; wnd = (CDialog*)GetWindowLong(hWnd,GWL_USERDATA); lcs = (LPCREATESTRUCT)lParam; SetWindowLong(hWnd,GWL_USERDATA,(long)wnd); if(wnd) { return wnd->DialogProc(hWnd,message,wParam,lParam); } else { if(message == WM_INITDIALOG) { wnd = (CDialog*)(lcs->lpCreateParams); return 1; } return FALSE; } }
long CDialog::DialogProc(HWND hDlg,UINT message,WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: return 1; case WM_CLOSE: EndDialog(hDlg,0); return 0; case WM_DESTROY: PostQuitMessage(0); default: CheckMSG(message,wParam,lParam); } return 0; }
danke schon im voraus für jede hilfe
thx
gruss reima
-
reima schrieb:
da kommen nicht nur 1-2 Nachrichten rein vor WM_INITDIALOG sondern ca. +100 Nachrichen, also ganz eine Menge, doch wie fange ich die am Besten ab??
machst du einfach ein flag in die dlgproc (static!!), das mit 'false' initialiseirt wird und wenn dann WM_INITDIALOG ankommt setzt du das flag einfach auf 'true'.
long CDialog::DialogProc (....) { static bool flag = false; if (message == WM_INITDIALIOG) flag = true; if (flag == false) { // messages vor WM_INITDIALIOG } else { // messages nach (und einschliesslich) WM_INITDIALIOG } }
-
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?