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? 😉


Anmelden zum Antworten