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.h

    Hier 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)


Anmelden zum Antworten