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!