Probleme mit OpenGL und BCB
-
Hey @all,
ich weiss, das wird zwar ein simples Problem sein, jedoch komme ich nicht auf den Fehler drauf.
Nun ich habe wollte mir die nehe.gamedec.org (OpenGL Tutorials) durchgehen, und da habe ich mir gedacht, ich schreibe mir ne kleine Klasse für den Anfang, wo Quadrate und Dreiecke gezeichnet werden. Jedoch schreibt er mir, wenn ich die Datei einbinde immer eine Fehlermeldung in der gl.hHier mal meine Klasse:
// cf_opengl.h #ifndef CF_OPENGL_FW #define CF_OPENGL_FW #include <gl\gl.h> // Header file for the OpenGL32 library #include <gl\glu.h> // Header file for the GLu32 library #include <gl\glaux.h> // Header file for the GLaux library class OpenGLFramework { private: GLfloat X, Y, Z; public: OpenGLFramework(); ~OpenGLFramework(); move3D(GLfloat, GLfloat, GLfloat); }; #endif // cf_opengl.cpp #include "cf_opengl.h" OpenGLFramework::OpenGLFramework() { } OpenGLFramework::~OpenGLFramework() { } OpenGLFramework::move3D(GLfloat _X, GLfloat _Y, GLfloat _Z) { this->X = _X; this->Y = _Y; this->Z = _Z; glTranslatef(this->X, this->Y, this->Z); }
Und hier die modifizierte Hauptdatei von NeHe (ich schreibe hier nur die modifikation, da die Datei etwas größer ist:
#include <vcl.h> #include <windows.h> // Header file for windows /* #include <gl\gl.h> // Header file for the OpenGL32 library #include <gl\glu.h> // Header file for the GLu32 library #include <gl\glaux.h> // Header file for the GLaux library */ // Meine Klasse #include "cf_opengl.h" #pragma hdrstop . . . // Here's where we do all the drawing int DrawGLScene(GLvoid) { // clear screen and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset the current modelview matrix glLoadIdentity(); // Zeichne Dreieck // statt dieser Funktion: glTranslatef(-1.5f,0.0f,-6.0f); OpenGLFramework* myOpenGL = new OpenGLFramework(); myOpenGL->move3D(-1.5f, 0.0f, -6.0f); // Move Left 1.5 Units And Into The Screen 6.0 glBegin(GL_TRIANGLES); // Drawing Using Triangles // Top glVertex3f( 0.0f, 1.0f, 0.0f); // Bottom Left glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Right glVertex3f( 1.0f,-1.0f, 0.0f); // Finished Drawing The Triangle glEnd(); // Everything went OK return true; } . . .
Wenn ich das so schreibe, kommt folgende Fehlermeldung:
[C++ Fehler] gl.h(1152): E2141 Fehler in der Deklarationssyntax [C++ Fehler] gl.h(1153): E2238 Bezeichner 'WINGDIAPI' mehrfach deklariert [C++ Fehler] gl.h(1153): E2141 Fehler in der Deklarationssyntax[C++ Fehler] gl.h(1154): E2238 Bezeichner 'WINGDIAPI' mehrfach deklariert [C++ Fehler] gl.h(1155): E2238 Bezeichner 'WINGDIAPI' mehrfach deklariert [C++ Fehler] gl.h(1156): E2238 Bezeichner 'WINGDIAPI' mehrfach deklariert . . usw.
Könnte mir da Vielleicht jemand helfen?
Mein Ziel ist es, das ich die ganzen Init methoden, später alles aus meiner Klasse holen kann.
MfG Roman1311
-
vor #include <gl/gl.h> muss ein #include <windows.h>
-
und du musst wohl nicht jedes frame ein neues "framwork " erzeugen oder?
-
basc schrieb:
und du musst wohl nicht jedes frame ein neues "framwork " erzeugen oder?
stimmt auffällig
-
Ja, stimmt schon das ich nicht jeden Frame ein neues Objekt erzeugen muss, das war eigentlich nur als test gedacht, auf jedenfall hatte das mit der windows.h einbinden funktioniert.
Danke für die schnellen Antworten
MfG Roman1311
-
So, ich habe die Klasse jetzt so ziemlich fertig, jedoch stehe ich vor dem wichtigestem Problem, und Zwar habe ich gelesen, das die Funktion
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc Deklaration
vor dem "CreateGLWindow" stehen muss, das es sonst nicht funktioniert, nun ich habe es zur Zeit so:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration for WndProc LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Check for windows messages switch (uMsg) { // Watch for window activate message case WM_ACTIVATE: { // Check minimization state if (!HIWORD(wParam)) { // Program is active active = true; } else { // Program is no longer active active = false; } // Return to the message loop return 0; } // Intercept system commands case WM_SYSCOMMAND: { // Check system calls switch (wParam) { // Screensaver trying to start? case SC_SCREENSAVE: // Monitor trying to enter powersave? case SC_MONITORPOWER: // Prevent from happening return 0; } // Exit break; } // Did we receive a close message? case WM_CLOSE: { // Send a quit message PostQuitMessage(0); // Jump back return 0; } // Is a key being held down? case WM_KEYDOWN: { // If so, mark it as true keys[wParam] = true; // Jump back return 0; } // Has a key been released? case WM_KEYUP: { // If so, mark it as false keys[wParam] = false; // Jump back return 0; } // Resize the OpenGL window case WM_SIZE: { // LoWord = Width, HiWord = Height myOpenGL->ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // Jump back return 0; } } // Pass all unhandled messages to DefWindowProc return DefWindowProc(hWnd,uMsg,wParam,lParam); } // Hier wird das Objekt erzeugt OpenGL* myOpenGL = new OpenGL();
Jedoch wird selbst in der WinProc auch eine Instanz verwendet. Er schreibt mir nun immer eine Fehlermeldung in der Methode "CreateGLWindow"
bool OpenGL::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { // Holds the results after searching for a match GLuint PixelFormat; // Windows class structure WNDCLASS wc; // Window extended style DWORD dwExStyle; // Window style DWORD dwStyle; // Grabs rctangle upper left / lower right values RECT WindowRect; // Set left value to 0 WindowRect.left = (long)0; // Set right value to requested width WindowRect.right = (long)width; // Set top value to 0 WindowRect.top = (long)0; // Set bottom value to requested height WindowRect.bottom = (long)height; // Set the global fullscreen flag fullscreen = fullscreenflag; // Grab an instance for our window hInstance = GetModuleHandle(NULL); // Redraw on size, and own DC for window wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // WndProc handles messages wc.lpfnWndProc = (WNDPROC) WndProc; . . .
Hier schreibt er mir nun bei der Zeile
// WndProc handles messages wc.lpfnWndProc = (WNDPROC) WndProc;
folgende Fehlermeldung
[C++ Fehler] opengl_class.cpp(327): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden
Könnte mir da bitte jemand weiterhelfen
MfG Roman1311
-
gib mal in der suchfunktion folgende begriffe ein "wndproc klasse" dann wirst du ein haufen solcher probleme und lösungen findet wie man am besten die wndproc kapselt. (vor allem im winapi forum)