Problem mit Zeiger auf Elementsfunktionen



  • Hallo ich könnte mal etwas Hilfe gebrauchen.

    (Ich versuche gerade ein kleines Framework für OpenGL unter Windows zu schreiben, es gibt nur noch einen Fehler)

    Jeder von euch (Windows-Programmiers) weiß wahrscheinlich, dass man in der
    WNDCLASS-Struktur im Element "lpfnWndProc" eine Funktion zur Verarbeitung der Nachrichten angeben muss.
    Nehmen wir mal an, ich habe eine Klasse, die das für den Programmierer übernimmt, und demzufolge eine eigene Funktion für diesen Zweck definiert.

    Nun das Problem, wie gibt man diese Funktion korrekt an?

    m_hInstance         = GetModuleHandle(NULL);
        wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wc.lpfnWndProc      = (WNDPROC) WndProc;
        wc.cbClsExtra       = 0;
        wc.cbWndExtra       = 0;
        wc.hInstance        = m_hInstance;
        wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);
        wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground    = NULL;
        wc.lpszMenuName     = NULL;
        wc.lpszClassName    = "OpenGL";
    

    Die Funktion WndProc ist innerhalb der Klasse deklariert
    und wird auch in einer Funktion der Klasse der Struktur zu gewiesen.
    Aber wenn ich es so wie Oben mache, bekomme ich folgende Fehlermeldung:

    --------------------Konfiguration: Framework - Win32 Debug--------------------
    Kompilierung läuft...
    OGLFramework.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\OpenGL Framework\Framework\OGLFramework.cpp(46) : error C2440: 'type cast' : '' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' konvertiert werden
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
    Fehler beim Ausführen von cl.exe.

    Framework.exe - 1 Fehler, 0 Warnung(en)

    Hier der Header des Frameworks:

    /*
    
        *****************************************************************
        *                                                               *
        *   OpenGL-Framework basierend auf Tutorials von NeHe           *
        *   von Mathias Kahl aka. MAG ( GAP-PROJECT )                   *
        * www.gap-project.net    |   ©2003                               *
        *                                                               *
        *****************************************************************
    
    */
    
    #ifndef _OGLFRAMEWORK_
    #define _OGLFRAMEWORK_
    
    #include <windows.h>
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>
    
    #pragma comment(lib, "opengl32.lib")    
    #pragma comment(lib, "glu32.lib")
    #pragma comment(lib, "glaux.lib")
    
    #ifndef _CWMKEY
    #define _CWMKEY VK_F1
    #endif
    
    struct WINDOWDESC
    {
        char*       strTitle;
        int         iWidth;
        int         iHeight;
        int         iBits;
        bool        bFullscreen;
    };
    
    class C3DApplication
    {
    protected:
        HGLRC               m_hRC;
        HDC                 m_hDC;
        HWND                m_hWnd;
        HINSTANCE           m_hInstance;
    
        bool                m_bKeys[256];
        bool                m_bActive;
        bool                m_bFullscreen;
        WINDOWDESC          m_wdWndDesc;
    
        GLvoid              ReSizeGLScene(GLsizei width, GLsizei height);
        int                 InitGL(GLvoid);
        GLvoid              KillGLWindow(GLvoid);
        bool                CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag);
        LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    
        virtual bool        UserWndProc(HWND, UINT, WPARAM, LPARAM) { return true; };
        virtual bool        UserInitApplication() { return true; };
        virtual bool        UserRunApplication() { return true; };
        virtual bool        UserShutdownApplication() { return true; };
    
    public:
                            C3DApplication();
                            ~C3DApplication();
    
        bool                Init(char* title,int width,int height,int bits,bool fullscreenflag);
        bool                Run();
        bool                Exit();
    
    };
    
    #endif
    

    Ich danke im Voraus!



  • Die WinProc muß als "normale" (meistens globale) Funktion verfügbar sein, darf also keine Memberfunktion sein...
    Und wenn doch, mußt Du sie statisch machen...!

    Im Win-API Forum wurde das Thema schon 1000x behandelt, also dort mal schauen...
    Probleme gibt's z.B., wenn Du mehrere Objekte dieser "Wrapper-Klasse" instantiieren willst, da dann alle die gleiche WinProc benutzen müssen (da statisch)...

    cd9000 oder so ähnlich hatte mal'n API-Wrapper dafür... einfach mal schauen, ggf. FAQ...



  • Wow, vielen dank!


Anmelden zum Antworten