DialogBox() Funktion und Funktionspointer in Klasse



  • Hallo,

    also ich weiß nicht ob das hier, dass Richtige Forum ist, aber ich versuche es einfach mal.

    Um die Messages einer Dialog Box zu handeln benötigt man ja eine CALLBACK-Funktion. In dem DialogBox() Funktionsaufruf wird dann als 4. Parameter ein Pointer auf diese CALLBACK-Funktion benötigt.

    Wenn ich den Code einfach nur runterhacke (ohne Klassen) funktionert das Ganze auch wunderbar. Sobald ich den Kram in Klassen kapsele bekomm ich den Aufruf der DialogBox() Funktion nicht hin 😕

    Dazu folgendes Bsp:

    void GUIControl::init(HINSTANCE hInst)
    {
        InitCommonControls();
        // Display the main dialog box.
        DialogBox( hInst, MAKEINTRESOURCE(IDD_MOUSE), NULL, &GUIControl::dlgProc);
    }
    
    INT_PTR CALLBACK GUIControl::dlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        //handle GUI components
    }
    

    Der Compiler spuckt mir dann folgende Fehlermeldung aus:

    error C2664: 'DialogBoxParamA' : cannot convert parameter 4 from 'INT_PTR (__stdcall GUIControl::* )(HWND,UINT,WPARAM,LPARAM)' to 'DLGPROC'
    

    Was mache ich da falsch? Hab schon etliche Änderungen versucht und ohne die Klasse läuft das ganze ja auch...
    Warscheinlich mache ich etwas ganz böses, hab aber von Windowsprogrammierung keine Ahnung...

    Schonmal vielen Dank für die Hilfe!

    Viele Grüße
    fisch



  • Bei C++-Memberfunktionen gibt es als ersten Funktionsparameter immer den this-Zeiger, danach kommen die restlichen Funktionsparameter. Dies entspricht aber nicht mehr der erforderlichen Dialogprozedur-Funktion.

    Abhilfe: GUIControl::dlgProc statisch definieren, statt DialogBox die Funktion DialogBoxParam verwenden und dabei LPARAM mit dem this-Zeiger füttern. Anschließend musst Du in WM_INITDIALOG den übergebenen LPARAM sichern, damit Du in späteren Nachrichten auf das GUIControl-Objekt zugreifen kannst.



  • erstmal danke für die antwort!
    hmm allerdings möchte ich dlgProc nicht static definieren, dann komme ich nämlich nicht mehr an die objekt-attribute die ich brauche. außerdem müsste ich die anderen memberfunktion die ich daraus aufrufe auch static definieren. ich würde gern wenn es geht mit dem objekt arbeiten. gibts da keine lösung?

    grüße
    fisch



  • Ohne statische Dialogprozedur geht es nicht. Es ist aber nicht nötig, die anderen Klassenfunktionen auch statisch zu machen. Eine Lösung hatte ich Dir im vorigen Beitrag schon beschrieben.

    Mal ungeprüft:

    void GUIControl::init(HINSTANCE hInst)
    {
        InitCommonControls();
        // Display the main dialog box.
        DialogBoxParam( hInst, MAKEINTRESOURCE(IDD_MOUSE), NULL, &GUIControl::dlgProc, (LPARAM) this);
    }
    
    INT_PTR CALLBACK GUIControl::dlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	GUIControl* pThis = (GUIControl*) GetWindowLongPtr(hDlg, GWLP_USERDATA);
    
    	switch (msg)
    	{
    	case WM_INITDIALOG:
    
    		SetWindowLongPtrW(hDlg, GWLP_USERDATA, lParam);
    		break;
    
    	case WM_IRGENDWAS:
    
    		pThis->MachIrgendwas();
    		break;
    	}
    
    	return DefDlgProc(hDlg, msg, wParam, lParam);
    }
    

Anmelden zum Antworten