OpenGL Code Problem



  • Hallo, ich habe mir vor kurzem das Buch "3D-Grafik mit OpenGl" gekauft, da ich nun von 2D auf 3D umsteigen wollte, nur ich werde schon mit Fehlermeldungen bei dem ersten Beispielprogramm beschmissen, dass ich von der CD kopiert habe. Ich benutze Visual Studio C++ 2010 (Vieleicht liegt es ja da drann). Hoffe ihr könnt mir helfen, da dies nicht in dem Buch beschrieben ist.

    screen_interface.h :

    #ifndef SCREEN_INTERFACE_H
    #define SCREEN_INTERFACE_H
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef unsigned char uchar;
    typedef unsigned short ushort;
    typedef unsigned long ulong;
    
    void exit_error( char *message );
    void exit_nofile( char *user, char *filename );
    void exit_nomemory( char *user, char *array );
    void message( char *title, char *message );
    
    #define x_res screen_interface.get_xr()
    #define y_res screen_interface.get_yr()
    
    #define WIN32_LEAN_AND_MEAN
    
    LRESULT CALLBACK main_window_procedure( HWND main_window_handle, UINT message, WPARAM wparam, LPARAM lparam )
    {
      if( message == WM_CLOSE ) {  PostQuitMessage( 0 );  return 0;  }
    
      return DefWindowProc( main_window_handle, message, wparam, lparam );
    }
    
    class hardware_interface
    {
      private:
    	uchar enlarged;
    	long x_resolution, y_resolution;
    
        HWND main_window_handle;
        HDC device_context;
        HGLRC rendering_context;
    	DEVMODE old_screen_settings;
    
        void initialise_platform( void );
    
      public:
        void fullscreen( HINSTANCE hInstance, long xr, long yr );
    	void open_window( HINSTANCE hInstance, long xr, long yr );
        void close_window( void );
    
    	long get_xr( void ) {  return x_resolution;  }
        long get_yr( void ) {  return y_resolution;  }
    
        void swap_buffers( void ) {  SwapBuffers( device_context );  }
    
    	hardware_interface( void ) : enlarged( 0 ), x_resolution( 0 ), y_resolution( 0 )
        {
          main_window_handle = NULL;  device_context = NULL;  rendering_context = NULL;
          memset( &old_screen_settings, 0, sizeof( old_screen_settings ) );
        }
       ~hardware_interface( void ) {  close_window();  }
    } screen_interface;
    
    void hardware_interface::fullscreen( HINSTANCE hinst, long xr, long yr )
    {
      x_resolution = xr;  y_resolution = yr;
      enlarged = 1;
    
      if( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &old_screen_settings ) != TRUE )
    	exit_error( "Fehler während der Ermittlung der aktuellen Bildschirmbetriebsart.\n" );
    
      WNDCLASS winclass;
    
      winclass.style = CS_OWNDC;
      winclass.lpfnWndProc = main_window_procedure;
      winclass.cbClsExtra = 0;
      winclass.cbWndExtra = 0;
      winclass.hInstance = hinst;
      winclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      winclass.hCursor = LoadCursor( NULL, IDC_ARROW );
      winclass.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH );
      winclass.lpszMenuName = NULL;
      winclass.lpszClassName = "Main Window";
      RegisterClass( &winclass );
    
      char window_name[] = "3D-Grafik Programmierung";
    
      main_window_handle = CreateWindowEx
      (
        WS_EX_TOPMOST, "Main Window", window_name, WS_VISIBLE | WS_POPUP,
        0,0, xr, yr, NULL, NULL, hinst, NULL
      );
    
      if( main_window_handle == 0 )
        exit_error( "Fehler beim Öffnen des Programmfensters.\n" );
    
      long bit_depth = 32;
    
      DEVMODE new_screen_settings;
    
      memset( &new_screen_settings, 0, sizeof( new_screen_settings ) );
      new_screen_settings.dmSize = sizeof( new_screen_settings );
      new_screen_settings.dmPelsWidth = xr;
      new_screen_settings.dmPelsHeight = yr;
      new_screen_settings.dmBitsPerPel = bit_depth;
      new_screen_settings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    
      if( ChangeDisplaySettings( &new_screen_settings, 0 ) != DISP_CHANGE_SUCCESSFUL )
    	exit_error( "Fehler beim Einstellen der gewünschten Bildschirmbetriebsart.\n" );
    
      ShowCursor( 0 );
    
      initialise_platform();
    }
    
    void hardware_interface::open_window( HINSTANCE hinst, long xr, long yr )
    {
      x_resolution = xr;  y_resolution = yr;
      long bit_depth = 32;
    
      WNDCLASS winclass;
    
      winclass.style = CS_OWNDC;
      winclass.lpfnWndProc = main_window_procedure;
      winclass.cbClsExtra = 0;
      winclass.cbWndExtra = 0;
      winclass.hInstance = hinst;
      winclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      winclass.hCursor = LoadCursor( NULL, IDC_ARROW );
      winclass.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH );
      winclass.lpszMenuName = NULL;
      winclass.lpszClassName = "Main Window";
      RegisterClass( &winclass );
    
      int x_add = 2 * (GetSystemMetrics( SM_CXBORDER ) + GetSystemMetrics( SM_CXEDGE ));
      int y_add = 2 * (GetSystemMetrics( SM_CYBORDER ) + GetSystemMetrics( SM_CYEDGE )) + GetSystemMetrics( SM_CYCAPTION );
    
      char window_name[] = "Grafikprogrammierung mit OpenGL";
    
      main_window_handle = CreateWindow
      (
        "Main Window", window_name, WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
        0, 0, xr+x_add, yr+y_add, NULL, NULL, hinst, NULL
      );
    
      if( main_window_handle == 0 )
        exit_error( "Fehler beim Öffnen des Programmfensters.\n" );
    
      initialise_platform();
    }
    
    void hardware_interface::initialise_platform( void )
    {
      PIXELFORMATDESCRIPTOR pfd;
      int format;
    
      memset( &pfd, 0, sizeof( pfd ) );
      pfd.nSize = sizeof( pfd );
      pfd.nVersion = 1;
      pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;// | PFD_DOUBLEBUFFER;
      pfd.iPixelType = PFD_TYPE_RGBA;
      pfd.cColorBits = 32;
      pfd.cDepthBits = 32;
      pfd.cAlphaBits = 8;
      pfd.iLayerType = PFD_MAIN_PLANE;
    
      device_context = GetDC( main_window_handle );
      format = ChoosePixelFormat( device_context, &pfd );
      SetPixelFormat( device_context, format, &pfd );
    
      rendering_context = wglCreateContext( device_context );
      wglMakeCurrent( device_context, rendering_context );
    
      glMatrixMode( GL_PROJECTION );  glLoadIdentity();
      gluOrtho2D( 0, x_resolution, 0, y_resolution );
      glMatrixMode( GL_MODELVIEW );
    }
    
    void hardware_interface::close_window( void )
    {
      if( enlarged )
        if( ChangeDisplaySettings( &old_screen_settings, 0 ) != DISP_CHANGE_SUCCESSFUL )
    	  exit_error( "Fehler beim Einstellen der ursprünglichen Bildschirmbetriebsart.\n" );
    
      wglMakeCurrent( NULL, NULL );
      wglDeleteContext( rendering_context );
      ReleaseDC( main_window_handle, device_context );
    
      DestroyWindow( main_window_handle );
    }
    
    void exit_error( char *message )
    {
      screen_interface.close_window();
    
      ShowCursor( 1 );
      MessageBox( NULL, message, "Programmabbruch nach einem schwerwiegenden Fehler", MB_OK );
    
      exit( 1 );
    }
    
    void exit_error( char *message, char *title )
    {
      screen_interface.close_window();
    
      ShowCursor( 1 );
      MessageBox( NULL, message, title, MB_OK );
    
      exit( 1 );
    }
    
    void exit_nofile( char *user, char *filename )
    {
      char string[ 500 ];
      sprintf( string, "%s: Fehler beim Öffnen der Datei '%s'.\n", user, filename );
    
      exit_error( string );
    }
    
    void exit_nomemory( char *user, char *array )
    {
      char string[ 500 ];
      sprintf( string, "%s: Fehler während der Reservierung von Arbeitsspeicher für das Array '%s'.\n", user, array );
    
      exit_error( string );
    }
    
    void message( char *title, char *message )
    {
      MessageBox( NULL, message, title, MB_OK ); 
    }
    
    #endif
    

    Fehlermeldungen :

    1>------ Erstellen gestartet: Projekt: Projekt, Konfiguration: Debug Win32 ------
    1> main.cpp
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(80): error C2440: '=': 'const char [12]' kann nicht in 'LPCWSTR' konvertiert werden
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(89): error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [12]' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(129): error C2440: '=': 'const char [12]' kann nicht in 'LPCWSTR' konvertiert werden
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(141): error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [12]' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(194): error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(204): error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(227): error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Spiel in den Projektkonfigurationen mal mit der Unicode-/Multibyte Zeichendarstellung rum.



  • Es gibt 2 Arten von Strings, ASCII-Strings und Unicode-Strings. Dein Projekt ist auf Unicode gestellt, damit verlangen Funktionen wie MessageBox Unicode-Strings, du gibst ihnen aber ASCII-Strings und der Compiler meckert.

    Lösung 1: Stelle in den Projekteinstellungen von Unicode auf ASCII um
    Lösung 2: Benutze Unicode-Strings. Beispiel: void message(wchar_t *title, wchar_t *message); winclass.lpszClassName = L"Main Window";
    Lösung 3: Verlange explizit die ASCII-Variante: MessageBoxA statt MessageBox, WNDCLASSA statt WNDCLASS usw.



  • nwp3 schrieb:

    Lösung 3: Verlange explizit die ASCII-Variante: MessageBoxA statt MessageBox, WNDCLASSA statt WNDCLASS usw.

    👍



  • Das Problem was ich nun habe, ich kann nur von Unicode auf Multybyte bzw "nicht angegeben" umstellen. Jedoch kriege ich im Multybyte Satz deutlich weniger Fehler :

    1>------ Erstellen gestartet: Projekt: Projekt, Konfiguration: Debug Win32 ------
    1> main.cpp
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(212): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(371): Siehe Deklaration von 'sprintf'
    1>c:\users\robin\desktop\opengl\projekt\projekt\screen_interface.h(220): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(371): Siehe Deklaration von 'sprintf'
    1>LINK : fatal error LNK1104: Datei "glew32.lib" kann nicht geöffnet werden.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Das sind Warnings, keine Fehler...



  • Leider doch :

    1>LINK : fatal error LNK1104: Datei "glew32.lib" kann nicht geöffnet werden.

    Nur weiß ich nicht, warum der die Library jetzt net mehr öffnen kann.



  • Konnte "er" vorher wohl auch nicht, nur bist du vorhin noch gar nicht so weit gekommen, dass "er" es überhaupt versucht hätte. Grund ist vermutlich, dass "er" sie nicht finden kann, oder dass es eine falsche Library ist (64 Bit vs. 32 Bit!?)...



  • Habe jetzt mal statt der glew32.lib die Glee.lib eingetragen, aber er findet weder die eine, noch die andere 😕



  • Dann hast du eben was falsch konfiguriert...

    Wo liegen die libs? Hast du die entsprechenden Pfade richtig gesetzt? Sind es überhaupt für deinen Compiler passende libs?


Log in to reply