Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

DevC++ und MinGW

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.08.2012, 21:01    Titel: DevC++ und MinGW Antworten mit Zitat

Hab da mal eine Frage bzgl. dem nutzen von MinGW
und zwar wollte ich eigentlich nur mal ein paar beispiele mit C++ testen, aber das scheint schon ein riesen aufwandt mit C zu sein da ich wohl nahezu alle libs explizit 'linken' muss (was mir ziemlich bescheuert erscheint peinlich)
Ich hab also ein beispiel wo alle header inkluiert sind und ich bekomme es absolut nicht hin das irgendwie richtig zum laufen zu bekommen, nachdem ich zwar schon alle opengl sachen dazu gelinkt habe muss ich scheinbar auch jede einzelne windows.dll explizit angeben was mir doch mehr als mühsam und wie gesagt bescheuert erscheint, ich habe schliesslich die windows.h includiert was doch wirklich ausreichen sollte???
Gibts ausser einen wechsel zu MV++ der wenigstens '#Pragma' versteht irgendwas um sich diesen aufwandt zu sparen??

Bei ausführung dieses einfachen beispiels (das ich sogar unter FB mit weniger schwierigkeiten, übersetzt und zum laufen bekommen habe)
Code:
// Tutorial 4 "3D-Objekte"
// gedownloaded von www.codeworx.org
// Version 1.0, Hans-Jakob Schwer, 21.11.2001
// Original von Jeff Molofee, neu kommentiert und übersetzt aus dem Englischen

#include <windows.h>  // diverse Windowsfunktionen
#include <gl\glu.h>   // Damit kann Glu32 genutzt werden.
#include <gl\gl.h>    // Damit kann OpenGL32 genutzt werden.
#include <gl\glaux.h> // Und das Gleiche nochmal für Glaux 

HGLRC hRC=NULL;         // Der OpenGL Rendering Context
HDC hDC=NULL;           // Geschützter GDI Device Context
HWND hWnd=NULL;         // Verweist später auf den Windows Handle
HINSTANCE hInstance;   // Die Instanz der Anwendung

bool keys[256]; // Vektor (Array) der den Status
                // einzelner Tasten enthält   
                // (gedrückt/nicht gedrückt)

bool active=TRUE;  // Wenn active FALSE ist, wurde das
                   // Fenster vom Benutzer minimiert.

bool fullscreen=TRUE; // Läuft das Programm im Vollbildmodus
                      // oder nicht?

GLfloat   rdreieck;
// Der Drehwinkel für das Dreieck

GLfloat   rviereck;
// Der Drehwinkel für das Viereck

GLfloat rachteck;
// Der Drehwinkel für das Achteck


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   
// WndProc wird deklariert

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
// Initialisierung des OpenGL-Fensters
{
  if (height==0)
  {     
    height=1;   
  }

  // height darf nicht 0 sein, damit es im späteren
  // Programmablauf nicht zu einer Division durch 0 kommt.

  glViewport(0, 0, width, height);
  // Hier wird der Mittelpunkt auf den die Perspektive zuläuft
  // zurückgesetzt.

  glMatrixMode(GL_PROJECTION);
  // Hier wird die Projektionsmatrix festgelegt
   
  glLoadIdentity();
  // und angepasst

  gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
  // Hier wird die das Verhältnis der Höhe zur Breite übergeben
  // und der Verzerrungswinkel von 45 Grad übergeben

  glMatrixMode(GL_MODELVIEW);
  // Hier wird die sogenannte modelview-Matrix festgelegt
 
  glLoadIdentity();
  // und angepasst.
}

int InitGL(GLvoid)
{
  glShadeModel(GL_SMOOTH);
  // Das Smooth Shading wird aktiviert, das
  // sehr schöne Farbübergänge auf Körpern ermöglicht.

  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  // In diesem Falle ein schwarzer Hintergrund

  glClearDepth(1.0f);
  // depht buffer zurückgesetzt

  glEnable(GL_DEPTH_TEST);
  // Aktivierung des depht Tests (dazu später mehr.)

  glDepthFunc(GL_LEQUAL);
  // Der Typ des Depht Tests wird festgelegt

  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  // Perspektive wird festgelegt

  return TRUE; // Initialisierung scheint geklappt zu haben!
}



int DrawGLScene(GLvoid)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // Die vorherige Szene wird vom Bildschirm gelöscht,
  // damit die neuen nicht einfach über die alten   
  // Objekte gezeichnet werden

  glLoadIdentity();
  // modelview-Matrix wird zurückgesetzt 

  glTranslatef(-1.5f,-1.5f,-8.0f);
  // Auf der X-Achse 1.5 Einheiten zurück (Nach links)
  // Auf der Y-Achse 1.5 Einheiten zurück (Nach unten)
  // Auf der Z-Achse 6 Einheiten zurück (In den Bildschirm hinnein.)

  glRotatef(rdreieck,0.0f,1.0f,0.0f);
  // Die Pyramide soll um die Y-Achse rotiert werden

  glBegin(GL_TRIANGLES);
  // Es folgen die Koordinaten für mehrere Dreiecke

    glColor3f(0.0f,0.0f,1.0f); // das vordere soll blau werden
    glVertex3f( 0.0f, 1.0f, 0.0f); // oben (vorderes Dreieck)
    glVertex3f(-1.0f,-1.0f, 1.0f); // links (vorderes Dreieck)
    glVertex3f( 1.0f,-1.0f, 1.0f); // rechts (vorderes Dreieck)

    glColor3f(1.0f,0.0f,0.0f); // das rechte soll rot werden
    glVertex3f( 0.0f, 1.0f, 0.0f);  // oben (rechtes Dreieck)
    glVertex3f( 1.0f,-1.0f, 1.0f);  // links (rechtes Dreieck)
    glVertex3f( 1.0f,-1.0f, -1.0f); // rechts (rechtes Dreieck)

    glColor3f(0.0f,1.0f,0.0f); // das hintere grün
    glVertex3f( 0.0f, 1.0f, 0.0f);  // oben (hinteres Dreieck)
    glVertex3f( 1.0f,-1.0f, -1.0f); // links (hinteres Dreieck)
    glVertex3f(-1.0f,-1.0f, -1.0f); // rechts (hinteres Dreieck)
 
    glColor3f(1.0f,1.0f,0.0f); // und das linke gelb
    glVertex3f( 0.0f, 1.0f, 0.0f); // oben (linkes Dreieck)
    glVertex3f(-1.0f,-1.0f,-1.0f); // links (linkes Dreieck)
    glVertex3f(-1.0f,-1.0f, 1.0f); // rechts (linkes Dreieck)

  glEnd(); // Zeichenaktion beenden

  glLoadIdentity(); // zurücksetzen


  glTranslatef(-0.5f,0.8f,-9.0f);
  // 5 Einheiten nach links, 9 Einheiten "in" den Schirm

  glRotatef(rviereck,1.0f,1.0f,0.0f);
  // Der Würfel soll um die X- und Y-Achse rotiert werden

  glBegin(GL_QUADS); // Vierecke zeichnen

    glColor3f(0.0f,1.0f,0.0f); // Mit Blau gehts los
    glVertex3f( 1.0f, 1.0f,-1.0f); // oben rechts (OBEN)
    glVertex3f(-1.0f, 1.0f,-1.0f); // oben links (OBEN)
    glVertex3f(-1.0f, 1.0f, 1.0f); // unten links (OBEN)
    glVertex3f( 1.0f, 1.0f, 1.0f); // unten rechts  (OBEN)

    glColor3f(1.0f,0.5f,0.0f); // Orange
    glVertex3f( 1.0f,-1.0f, 1.0f); // oben rechts (UNTEN)
    glVertex3f(-1.0f,-1.0f, 1.0f); // oben links (UNTEN)
    glVertex3f(-1.0f,-1.0f,-1.0f); // unten links (UNTEN)
    glVertex3f( 1.0f,-1.0f,-1.0f); // unten rechts  (UNTEN)

    glColor3f(1.0f,0.0f,0.0f); // Rot
    glVertex3f( 1.0f, 1.0f, 1.0f); // oben rechts (VORNE)
    glVertex3f(-1.0f, 1.0f, 1.0f); // oben links (VORNE)
    glVertex3f(-1.0f,-1.0f, 1.0f); // unten links (VORNE)
    glVertex3f( 1.0f,-1.0f, 1.0f); // unten rechts  (VORNE)

    glColor3f(1.0f,1.0f,0.0f); // Gelb
    glVertex3f( 1.0f,-1.0f,-1.0f); // oben rechts (HINTEN)
    glVertex3f(-1.0f,-1.0f,-1.0f); // oben links (HINTEN)
    glVertex3f(-1.0f, 1.0f,-1.0f); // unten links (HINTEN)
    glVertex3f( 1.0f, 1.0f,-1.0f); // unten rechts  (HINTEN)

    glColor3f(0.5f,0.5f,0.5f); // Grau
    glVertex3f(-1.0f, 1.0f, 1.0f); // oben rechts (LINKS)
    glVertex3f(-1.0f, 1.0f,-1.0f); // oben links (LINKS)
    glVertex3f(-1.0f,-1.0f,-1.0f); // unten links (LINKS)
    glVertex3f(-1.0f,-1.0f, 1.0f); // unten rechts  (LINKS)

    glColor3f(1.0f,0.0f,1.0f); // Violett
    glVertex3f( 1.0f, 1.0f,-1.0f); // oben rechts (RECHTS)
    glVertex3f( 1.0f, 1.0f, 1.0f); // oben links (RECHTS)
    glVertex3f( 1.0f,-1.0f, 1.0f); // unten links (RECHTS)
    glVertex3f( 1.0f,-1.0f,-1.0f); // unten rechts (RECHTS)

  glEnd(); // Zeichenaktion beenden

  glLoadIdentity(); // zurücksetzen


  glTranslatef(3.0f,0.0f,-9.0f);
  // 3 Einheiten nach rechts, 9 Einheiten "in" den Schirm

  glRotatef(rachteck,0.0f,1.0f,0.0f);
  // Das Achteck soll um die Z-Achse rotiert werden

  glBegin(GL_POLYGON); // Ein Polygon (in diesem Falle ein Achteck.)
    // jede Ecke bekommt eine andere Farbe

    glColor3f(1.0f,0.0f,0.0f); // rot
    glVertex3f(-0.5f, 1.5f, -1.0f); // obere Ecke links
    glVertex3f( 0.5f, 1.5f, -1.0f); // obere Ecke rechts

    glColor3f(0.0f,0.0f,1.0f); // blau
    glVertex3f( 1.5f, 0.5f, -1.0f); // rechte Ecke oben
    glVertex3f( 1.5f,-0.5f, -1.0f); // rechte Ecke unten

    glColor3f(0.0f,1.0f,0.0f); // grün
    glVertex3f( 0.5f,-1.5f, -1.0f); // untere Ecke rechts
    glVertex3f(-0.5f,-1.5f, -1.0f); // untere Ecke links

    glColor3f(1.0f,1.0f,0.0f); // gelb
    glVertex3f(-1.5f,-0.5f, -1.0f); // linke Ecke unten
    glVertex3f(-1.5f, 0.5f, -1.0f); // linke Ecke oben
  glEnd(); // Zeichenaktion beenden

  glBegin(GL_TRIANGLES); //Dreiecke sollen gezeichnet werden
    // jedes bekommt eine andere Farbe

    glColor3f(1.0f,0.0f,0.0f); // rot
    glVertex3f( 0.0f, 0.0f, 1.0f); // gemeinsamer Mittelpunkt
    glVertex3f(-0.5f, 1.5f, -1.0f); // obere Ecke links
    glVertex3f( 0.5f, 1.5f, -1.0f); // obere Ecke rechts

    glColor3f(0.0f,0.0f,1.0f); // blau
    glVertex3f( 0.0f, 0.0f, 1.0f); // gemeinsamer Mittelpunkt
    glVertex3f( 1.5f, 0.5f, -1.0f); // rechte Ecke oben
    glVertex3f( 1.5f,-0.5f, -1.0f); // rechte Ecke unten

    glColor3f(0.0f,1.0f,0.0f); // grün
    glVertex3f( 0.0f, 0.0f, 1.0f); // gemeinsamer Mittelpunkt
    glVertex3f( 0.5f,-1.5f, -1.0f); // untere Ecke rechts
    glVertex3f(-0.5f,-1.5f, -1.0f); // untere Ecke links

    glColor3f(1.0f,1.0f,0.0f); // gelb
    glVertex3f( 0.0f, 0.0f, 1.0f); // gemeinsamer Mittelpunkt
    glVertex3f(-1.5f,-0.5f, -1.0f); // linke Ecke unten
    glVertex3f(-1.5f, 0.5f, -1.0f); // linke Ecke oben
  glEnd(); // Zeichenaktion beenden

  rdreieck += 0.4f;
  // Der Drehwinkel des Dreiecks soll bei
  // jedem Durchgang um 0,4f verringert werden.

  rviereck += 0.7f;
  // Der Drehwinkel des Vierecks soll bei
  // jedem Durchgang um 0,7f erhöht werden.

  rachteck += 0.56f;
  // Der Drehwinkel des Achtecks soll bei
  // jedem Durchgang um 0,56f erhöht werden werden.

return TRUE; // Alles hat geklappt
}

GLvoid KillGLWindow(GLvoid)
{

  if (fullscreen) // Kontrolle auf Vollbildmodus
  {
    ChangeDisplaySettings(NULL,0); // Zurück zum Desktop
    ShowCursor(TRUE); // Der abgeschaltete Mauszeiger
                      // wird wieder angezeigt (Nicht
                      // vergessen ;)
  }

  if (hRC) // Rendering Context (RC) vorhanden?
  {
    if (!wglMakeCurrent(NULL,NULL)) // Kann der DC und RC überhaupt
                                    // gelöscht werden?
    {
      MessageBox(NULL,"Entfernen des DC und RC fehlgeschlagen.","Fehler",MB_OK | MB_ICONINFORMATION);
    }
   
    if (!wglDeleteContext(hRC)) // Kann der RC gelöscht werden?
    {
      MessageBox(NULL,"Entfernen des RC fehlgeschlagen.","Fehler...",MB_OK | MB_ICONINFORMATION);
    }
      hRC=NULL; // Der RC wird NULL gesetzt, also entfernt
    }

   if (hDC && !ReleaseDC(hWnd,hDC))
   // Kann der Device Context (DC) freigegeben werden?
   {
     MessageBox(NULL,"Freigabe des Device Context fehlgeschlagen.","Fehler",MB_OK | MB_ICONINFORMATION);

     hDC=NULL; // Der DC wird entfernt
   }

   if (hWnd && !DestroyWindow(hWnd))
   // Kann das Programmfenster geschlossen werden?
   {
     MessageBox(NULL,"Konnte hWnd nicht löschen.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

     hWnd=NULL; // Setze den hWnd auf NULL
   }

   if (!UnregisterClass("OpenGL",hInstance))
   // Kann die Registrierung rückgängig gemacht werden?

   {
     MessageBox(NULL,"Konnte Klasse nicht entfernen.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

     hInstance=NULL; // Setze hInstance auf NULL
   }
}

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{

  GLuint PixelFormat; // Speichert das Pixelformat


  WNDCLASS wc; // wc wird eine Instanz der Fensterklasse


  DWORD dwExStyle; // weitere Informationen
  DWORD dwStyle; // Fensterinformationen


  RECT WindowRect;
  // Speicher für aktuelle Auflösung
 
  WindowRect.left=(long)0;
  // Die linke Seite des Rechtecks wirtd auf 0 gesetzt

  WindowRect.right=(long)width;
  // Hier wird die gewünschte Breite des Fensters gespeichert

  WindowRect.top=(long)0;
  // Die obere Seite wird auch auf 0 gesetzt

  WindowRect.bottom=(long)height;
  // Und hier wird die Höhe abgelegt


  fullscreen=fullscreenflag;
  // Hier wird fullscreen
  // auf den Wert von fullscreenflag
  // gesetzt, welches ja übergeben wurde

  hInstance = GetModuleHandle(NULL);
  // Die Instanz des Programmes bekommt ein
  // Handle zugeordnet

  wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  // Bei Veränderungen in der Höhe und/oder Breite,
  // soll ne gezeichnet werden

  wc.lpfnWndProc = (WNDPROC) WndProc;
  // WndProc behandelt die auftretenden Nachrichten

  wc.cbClsExtra = 0; // Wird nicht benötigt
  wc.cbWndExtra = 0; // und das auch nicht
  wc.hInstance = hInstance; // Die Instanz wird festgelegt
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  // Lädt das Standardsymbol
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  // Lädt einen Cursor
  wc.hbrBackground = NULL;
  // Es soll kein bestimmter Hintergrund angezeigt werden
  wc.lpszMenuName = NULL; // Auch ein Menü wird nicht benötigt.
  wc.lpszClassName = "OpenGL"; // OpenGL wird der Name der Klasse

  if (!RegisterClass(&wc)) // Versuch die Klasse zu registrieren
  {
    MessageBox(NULL,"Konnte die Fensterklasse nicht registrieren.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE; // FALSE zurückgeben und beenden
  }

  if (fullscreen) // Soll im Vollbildmodus gestartet werden
  {

    DEVMODE dmScreenSettings;
    // Instanz von DEVMODE wird erzeugt

    memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
    // Diese wird geleert

    dmScreenSettings.dmSize=sizeof(dmScreenSettings);
    // dmsize soll genauso groß wie die dmScreenSettings sein

    dmScreenSettings.dmPelsWidth = width;
    // Die drei Werte (height, width und bits)
    // wurden der Prozedur übergeben und werden
    // nun in dmScreenSettings gespeichert

    dmScreenSettings.dmPelsHeight = height;
    dmScreenSettings.dmBitsPerPel = bits;
    dmScreenSettings.dmFields=DM_BITSPERPEL|
    DM_PELSWIDTH|DM_PELSHEIGHT;
    // Hier werden die drei Werte in einem Ausdruck gespeichert

    if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)
        !=DISP_CHANGE_SUCCESSFUL)   
    {

    // CDS_FULLSCREEN blendet zusätzlich die Startleiste aus

      if (MessageBox(NULL,"Der gewünschte Vollbildmodus wird nicht unterstützt, soll stattdessen im Fenstermodus ausgegeben werden?","OpenGL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
      {
        fullscreen=FALSE;
        // Der Benutzer möchte im Fenster weitermachen,
        // dazu wird fullscreen auf FALSE gesetzt
      }

      else
      {
        return FALSE;
        // Falls der Benutzer das Programm aus gegebenen
        // Anlass beenden will, wird FALSE zurückgegeben.
      }
    }
  }

  if (fullscreen)
  // Konnte in den Vollbildmodus geschaltet werden?
  // (Wenn nicht, wird ja im Fenster weitergemacht!)
  {
    dwExStyle=WS_EX_APPWINDOW; // Fenstereigenschaften
    dwStyle=WS_POPUP; // -"-
    ShowCursor(FALSE); // Der Mauszeiger wird nicht angezeigt
  }

  else
  {

    dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
    // Das Fenster soll zusätzlich einen 3D Rahmen bekommen

    dwStyle=WS_OVERLAPPEDWINDOW;
    // Ein typisches Windowsfenster mit
    // Minimieren, Maximieren, etc
  }

  AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
  // Fenster wird angepasst

  if (!(hWnd=CreateWindowEx( dwExStyle,
  // Die erweiterten Eigenschaften des    Fensters
  "OpenGL", // Der Name der Klasse
  title, // Der Titel des Fensters
  WS_CLIPSIBLINGS | // Wird von OpenGL benötigt
  WS_CLIPCHILDREN | // Wird auch von OpenGL benötigt
  dwStyle, // auch Eigenschaften des Fensters
  0, 0, // Die Position des zu erstellenden Fensters
  WindowRect.right-WindowRect.left,
  // Hier werden die ermittelten Werte für die Breite eingesetzt
  WindowRect.bottom-WindowRect.top, // und hier für die Länge
  NULL, // Es soll kein übergordnetes Fendster erstellt werden
  NULL, // kein Menü
  hInstance, // Die Instanz wird übergeben
  NULL))) // Wird nicht benötigt


  {
    KillGLWindow(); // Grafikeinstellungen zurücksetzen
    MessageBox(NULL,"Fenster konnte nicht erstellt werden.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
  }



  static PIXELFORMATDESCRIPTOR pfd=
  // pdf ist jetzt ein PIXELFORMATDESCRIPTOR
  {
    sizeof(PIXELFORMATDESCRIPTOR),
    // Die Größe muss natürlich stimmen
    1, // Versionsnummer
    PFD_DRAW_TO_WINDOW |
    // Das Format muss in Fenster sichtbar sein können
    PFD_SUPPORT_OPENGL |
    // OpenGL muss unterstützt werden
    PFD_DOUBLEBUFFER,
    // Double Buffering muss unterstützt werden
    PFD_TYPE_RGBA,
    // Das RGBA (Rot,Grün,Blau,Alpha(Transparenz))
    // muss unterstützt werden
    bits,
    // Die Farbtiefe, die schon
    // übergeben wurde, wird hier benötigt
    0, 0, 0, 0, 0, 0, // wird nicht benötigt
    0, // kein Alpha Buffer
    0, // Shift Bit ignoriert
    0, // kein Accumulation Buffer
    0, 0, 0, 0, // nicht benötigt
    16, // 16Bit Z-Buffer (Depth Buffer)
    0, // kein Stencil Buffer
    0, // kein Auxiliary Buffer
    PFD_MAIN_PLANE,
    // Die Hauptebene auf die später gezeichnet wird
    0, // unwichtig
    0, 0, 0 // keine Ebenenmasken benötigt
  };


 if (!(hDC=GetDC(hWnd))) // Versuch, den DC zu bekommen
   {
     KillGLWindow();
     // Alles rückgängig machen
     MessageBox(NULL,"Konnte keinen DC erstellen.","ERROR",MB_OK|MB_ICONEXCLAMATION);
     return FALSE; // FALSE zurückgeben, beenden
   }


  if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
  // Kann Windows ein passendes finden?
  {
   // Falls keins gefunden werden kann:
    KillGLWindow(); // Alles zurücksetzen
    MessageBox(NULL,"Konnte kein passendes Pixelformat finden.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE; // FALSE zurück und Ende.
  }


  if(!SetPixelFormat(hDC,PixelFormat,&pfd))
  // Kann das Pixelformat gesetzt werden?
    {
      KillGLWindow(); // Leider nicht, Fehlerpopup und raus
      MessageBox(NULL,"Konnte Pixelformat nicht setzen.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE; // FALSE zurück und raus
   }


  if (!(hRC=wglCreateContext(hDC))) // Versuch den RC zu bekommen
    {
      KillGLWindow(); // Alles rückgängig machen
      MessageBox(NULL,"Konnte keinen Rendering Context bekommen.","Fehler",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
    }



  if(!wglMakeCurrent(hDC,hRC)) // Versuch den RC zu aktivieren
  {
    KillGLWindow(); // hat nicht geklappt, also alles zurück
    MessageBox(NULL,"Konnte den Rendering Context nmicht aktivieren.","Fehler",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
  }



  ShowWindow(hWnd,SW_SHOW); // Fenster anzeigen
  SetForegroundWindow(hWnd); // Priorität des Programms wird erhöht
  SetFocus(hWnd); // Tastatureingaben werden
                  // jetzt an das Programm geleitet

  ReSizeGLScene(width, height); // Die Perspektive wird aktiviert


  if (!InitGL()) // Initialisiere das OpenGL Fenster
  {
    KillGLWindow(); // Falls das nicht geklappt
                    // haben sollte alles rückgängig machen

    MessageBox(NULL,"Initialisierung fehlgeschlagen.","Fehler",MB_OK|MB_ICONEXCLAMATION);
    return FALSE; // FALSE wird zurückgegeben
  }

  return TRUE; // Alles hat geklappt!!!
   
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{


  switch (uMsg) // Sind Nachrichten in der Nachrichtenschleife?
  {



    case WM_ACTIVATE: // Ist das Programm aktiv?
    {
      if (!HIWORD(wParam)) // Ist das Programm nicht minimiert?
      {
        active=TRUE; // active wird TRUE
      }

     else
     {
       active=FALSE; // Programm ist minimiert
     }   
 
     return 0; // Rückgabe: 0
   }



    case WM_SYSCOMMAND: // Ist ein Systemkommando
                        // (wie z.B. "Bildschirmschoner
                        // soll gestartet werden") vorhanden?
    {
      switch (wParam) // wParam würde diesen Befehl enthalten
      {
        case SC_SCREENSAVE:
        // Versucht Windows den Bildschirmschoner zu starten

        case SC_MONITORPOWER:
        // Soll der Monitor in den Stromsparmodus gehen?
       
        return 0;
        // Beide Fälle werden durch die Rückgabe von 0 verhindert
      }
      break; // Das wars.
    }

    case WM_CLOSE: // Ist eine WM_CLOSE Nachricht vorhanden?
    {
      PostQuitMessage(0);
      // Die Nachricht zum Beenden wird "gepostet"

      return 0; // und zurück.
    }

    case WM_KEYDOWN: // Drückt der Benutzer eine Taste???
    {
      keys[wParam] = TRUE;
      // Der Wert im Array keys[] der dem Code
      // der Taste entspricht, wird true gesetzt

      return 0; // und zurück...
    }

    case WM_KEYUP: // Wurde eine Taste losgelassen?
    {
      keys[wParam] = FALSE;
      // Wen ja, dann soll dieser Wert im Array keys[]
      // auf FALSE gesetzt werden
      return 0; // und zurück.
    }

    case WM_SIZE: // Die Fenstergröße wurde geändert
    {
      ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
      // LoWord ist die Breite, HiWord die Höhe,
      // ReSizeGLScene() verändert dann die
      // Größe des OpenGL-Fensters
      return 0; // und zurück
    }
  }




  return DefWindowProc(hWnd,uMsg,wParam,lParam);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

  MSG msg;
  BOOL done=FALSE;


  if (MessageBox(NULL,"Soll im Vollbildmodus gestartet werden?","Vollbilmodus gewünscht?",MB_YESNO|MB_ICONQUESTION)==IDNO)
  {
    fullscreen=FALSE; // Falls nein gedrückt wurde,
                      // wird fullscreen false gesetzt
  }


  if (!CreateGLWindow("Opengl Tutorial 4 - 3D Objekte - www.codeworx.org",640,480,16,fullscreen))
  {
    return 0; // Falls ein Fehler auftrat, beenden
  }


  while(!done) // Solange done nicht TRUE ist:
  {

    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    // Sind Nachrichten vorhanden
    {

    if (msg.message==WM_QUIT)
    // Liegt eine Nachricht zum beenden vpr?
    {
      done=TRUE; // Wenn dem so ist, wird done
                 // true und das Programm beendet
    }

    else
    // Wenn nicht werden die anderen Nachrichten ausgewertet

    {
      TranslateMessage(&msg); // Umformen der Nachricht
      DispatchMessage(&msg);
    }
  }

  else // Falls keine Nachrichten bereit liegen
  {

    if (active) // Programm aktiv?
    {
      if (keys[VK_ESCAPE]) // Wurde ESC gedrückt?
      {
        done=TRUE; // Wenn ESC gedrückt wurde, beenden
      }

      else // ESC wurde nicht gedrückt
      {

        DrawGLScene(); // Die Szene ausgeben
        SwapBuffers(hDC); // Die Puffer werden getauscht
      }
    }


    if (keys[VK_F1]) // Wird F1 gedrückt?
    {
      keys[VK_F1]=FALSE;
      // Es darf nicht gewartet werden bis F1 losgelassen wird,
      // ansonsten könnte das Bild mehrmals hin und herschalten

      KillGLWindow(); // Das aktuelle Fenster wird gelöscht
      fullscreen=!fullscreen;
      // fullscreen erhält seinen entgegengesetzten Wert
      // (bei FALSE TRUE, und bei TRUE FALSE.)

      if (!CreateGLWindow("openGL",640,480,16,fullscreen))   
      {
        return 0; // Zurück falls ein Fehler auftrat
      }
    }
  }
}



  KillGLWindow(); // Das Fenster löschen.
  return (msg.wParam); // Das Programm verlassen.
}
 


bekomme ich nach linken von -lopengl32, -lglu32 immernoch linker fehler die irgendwie alle zu windows gehören...

Zitat:

Compiler: Default compiler
Building Makefile: "D:\Dev-Cpp\Makefile.win"
Führt make... aus
make.exe -f "D:\Dev-Cpp\Makefile.win" all
g++.exe -D__DEBUG__ main.o Unbenannt1.o -o "Projekt1.exe" -L"D:/Dev-Cpp/lib" -mwindows lib/libopengl32.a lib/libglu32.a lib/libwinmm.a -lgmon -pg -g3 -nostdlib

Unbenannt1.o(.text+0x14d6):Unbenannt1.cpp: multiple definition of `WinMain@16'
main.o(.text+0x0):main.cpp: first defined here
D:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: warning: cannot find entry symbol _WinMainCRTStartup; defaulting to 00401000
main.o(.text+0x3b):main.cpp: undefined reference to `LoadIconA@8'
main.o(.text+0x55):main.cpp: undefined reference to `LoadIconA@8'
main.o(.text+0x6f):main.cpp: undefined reference to `LoadCursorA@8'
main.o(.text+0x9c):main.cpp: undefined reference to `RegisterClassExA@4'
main.o(.text+0x115):main.cpp: undefined reference to `CreateWindowExA@48'
main.o(.text+0x12d):main.cpp: undefined reference to `ShowWindow@8'
main.o(.text+0x153):main.cpp: undefined reference to `GetMessageA@16'
main.o(.text+0x165):main.cpp: undefined reference to `TranslateMessage@4'
main.o(.text+0x173):main.cpp: undefined reference to `DispatchMessageA@4'
main.o(.text+0x1a2):main.cpp: undefined reference to `PostQuitMessage@4'
main.o(.text+0x1c7):main.cpp: undefined reference to `DefWindowProcA@16'
Unbenannt1.o(.text+0xcaf):Unbenannt1.cpp: undefined reference to `ChangeDisplaySettingsA@8'
Unbenannt1.o(.text+0xcbe):Unbenannt1.cpp: undefined reference to `ShowCursor@4'
Unbenannt1.o(.text+0xd0d):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xd48):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xd74):Unbenannt1.cpp: undefined reference to `ReleaseDC@8'
Unbenannt1.o(.text+0xd9f):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xdc2):Unbenannt1.cpp: undefined reference to `DestroyWindow@4'
Unbenannt1.o(.text+0xded):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xe0f):Unbenannt1.cpp: undefined reference to `UnregisterClassA@8'
Unbenannt1.o(.text+0xe3a):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xe88):Unbenannt1.cpp: undefined reference to `GetModuleHandleA@4'
Unbenannt1.o(.text+0xec8):Unbenannt1.cpp: undefined reference to `LoadIconA@8'
Unbenannt1.o(.text+0xee2):Unbenannt1.cpp: undefined reference to `LoadCursorA@8'
Unbenannt1.o(.text+0xf08):Unbenannt1.cpp: undefined reference to `RegisterClassA@4'
Unbenannt1.o(.text+0xf34):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0xf71):Unbenannt1.cpp: undefined reference to `memset'
Unbenannt1.o(.text+0xfb5):Unbenannt1.cpp: undefined reference to `ChangeDisplaySettingsA@8'
Unbenannt1.o(.text+0xfe0):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x1023):Unbenannt1.cpp: undefined reference to `ShowCursor@4'
Unbenannt1.o(.text+0x1057):Unbenannt1.cpp: undefined reference to `AdjustWindowRectEx@16'
Unbenannt1.o(.text+0x10c9):Unbenannt1.cpp: undefined reference to `CreateWindowExA@48'
Unbenannt1.o(.text+0x1103):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x113a):Unbenannt1.cpp: undefined reference to `GetDC@4'
Unbenannt1.o(.text+0x1174):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x119b):Unbenannt1.cpp: undefined reference to `ChoosePixelFormat@8'
Unbenannt1.o(.text+0x11d1):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x11ff):Unbenannt1.cpp: undefined reference to `SetPixelFormat@12'
Unbenannt1.o(.text+0x122f):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x1288):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x12e0):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x1307):Unbenannt1.cpp: undefined reference to `ShowWindow@8'
Unbenannt1.o(.text+0x1317):Unbenannt1.cpp: undefined reference to `SetForegroundWindow@4'
Unbenannt1.o(.text+0x1327):Unbenannt1.cpp: undefined reference to `SetFocus@4'
Unbenannt1.o(.text+0x136e):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x144c):Unbenannt1.cpp: undefined reference to `PostQuitMessage@4'
Unbenannt1.o(.text+0x14c4):Unbenannt1.cpp: undefined reference to `DefWindowProcA@16'
Unbenannt1.o(.text+0x1503):Unbenannt1.cpp: undefined reference to `MessageBoxA@16'
Unbenannt1.o(.text+0x1586):Unbenannt1.cpp: undefined reference to `PeekMessageA@20'
Unbenannt1.o(.text+0x15a7):Unbenannt1.cpp: undefined reference to `TranslateMessage@4'
Unbenannt1.o(.text+0x15b5):Unbenannt1.cpp: undefined reference to `DispatchMessageA@4'
Unbenannt1.o(.text+0x15e7):Unbenannt1.cpp: undefined reference to `SwapBuffers@4'
collect2: ld returned 1 exit status

make.exe: *** [Projekt1.exe] Error 1

Ausführung beendet

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 06.08.2012, 21:43    Titel: Re: DevC++ und MinGW Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
nahezu alle libs explizit 'linken' muss (was mir ziemlich bescheuert erscheint peinlich)

Woher soll der Linker auch sonst wissen, welche Funktion du mit "glBlahBlubb" meinst?! In FB geschieht das implizit über den Präprozessor #inclib, bei einem "richtigen" Linker (an den FBC übrigens auch nur sein Output weiterreicht!) über einen Kommandozeilenparameter... Das ist absolut kein Unterschied!

Jedenfalls solltest du mal noch die user32.lib dazulinken. Ohne die fehlen dir ja sämtliche WinAPI-Funktionen. Nicht vergessen, C++ ist eine schlanke Sprache und tut ohne externe Bibliothken erst mal nicht viel von sich selbst (was auch gut ist) - die WinAPI ist nicht teil der C++-Standardbibliothek und muss deshalb auch dazugelinkt werden!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.08.2012, 23:07    Titel: Antworten mit Zitat

Windows scheinen wohl schon standard dll's zu sein jedenfalls brauchte ich diese nicht mehr explizit linken nachdem ich bei den compiler/linker optionen (mit denen ich rumgespielt hatte) wieder zurückgesetzt habe 'keine Standard Systemdateien oder Bibliotheken....' hatte ich auf 'yes'

Nun find ich das ganze dennoch sehr gewöhnungsbedürftig... in FB geht das ganze mit dem inclib, gibts etwas vergleichbares nicht auch für MinGW?

In FB bin ich es gewohnt einfach quellcode drauf los zu tippern und dann zu compilieren (Libs werden entsprechend den headern gelinkt)

Hier muss ich aber erst einmal ein 'Projekt' erstellen und dort dann noch zusätzlich zu den headern (wenn nicht standard-lib) extra in den Projekt Optionen 'linken' (ohne projekt keine projekt optionen und somit keine möglichkeit mal eben quick und dirty cpp-code zu 'testen')
jedenfalls mit Dev-Cpp

Hab mir auch mal COdeblocks und MinGW Dev Studio angesehen, haben mir beide nicht besonders zugesagt...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 06.08.2012, 23:40    Titel: Antworten mit Zitat

du willst Geany oder Notepad++ oder so und du willst lernen wie man Makefiles schreibt, wie man die Konsole benutzt und wie man das Konsolenfenster, das in dem Editor deiner Wahl integriert ist benutzt.
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.08.2012, 01:16    Titel: Antworten mit Zitat

makefails!

Auf Windows würde ich ja eher Visual Studio Express vorschlagen, kost nix, ist eine komplette IDE inklusive super Debugger, kost nix, und mit Windows-Bibliotheken hat man da auch keine Probleme.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2012, 01:54    Titel: Antworten mit Zitat

Zitat:
Auf Windows würde ich ja eher Visual Studio Express vorschlagen
Bei MSV verwirren mich einige Dinge, die Express version scheint zwar kostenlos aber wohl auch irgendwo eingeschränkt? (las auch irgendwas von 30tage testversion) darüber hinaus sind mir die Lizensbedingungen irgendwo unklar? In wie weit ist was erlaubt ?! Kommerzielle nutzung ect... es heisst man kann die Express version kostenlos registrieren und ist damit im vollen umfang nutzbar wo sich dann die frage stellt warum MS Visual Studio Pro auf Amazon mal eben 539,- Euro kostet...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 07.08.2012, 07:57    Titel: Antworten mit Zitat

Du kannst die Express Editions sowohl für private als auch kommerzielle Zwecke verwenden. Die 30-Tage beziehen sich auf die Zeit, in der du die Software ohne (kostenloser) Registrierung mit einem Microsoft Account verwenden kannst. Nach der Registrierung ist die Express zeitlich uneingeschränkt nutzbar, soweit ich weiß.

Einschränkungen ggü der Professional sind auf Wikipedia gelistet. Die wichtigsten Einschränkungen sind meiner Meinung nach:
- Keine Addons (d.h. keine "Productivity Power Tools" oder "Visual Assist X" usw.)
- Kein Profiling, keine Code-Metriken
- Keine Versionsverwaltung (kein TFS (Team Foundation Server); AnkhSVN nicht möglich, da Addin)
- Keine MFC/ATL integration

Du kannst übrigens irgendwo im Menü die erweiterten Toolbars/Menüs aktivieren. Ich weiß leider grad nicht auswendig wie der Menüeintrag heißt und wo er sich befindet, aber ich würds unbedingt aktivieren, da erst damit z.B. die Auswahlbox für verschiedene Build-Konfigurationen sichtbar wird.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.08.2012, 15:53    Titel: Antworten mit Zitat

Und man kann keine 64-Bit-Anwendungen damit erstellen (wohl aber mit dem frei verfügbaren Microsoft-Compiler aus dem Windows-SDK, wenn ich mich recht erinnere - und das ist praktisch der selbe Compiler). Aber das interessiert hier vermutlich eh niemanden. Für den "normalen" Benutzer, der ohne Code mit Altlasten (wie MFC) daherkommt, ist die Express-Version genau richtig. Wobei der fehlende Support für Visual Assist natürlich schon ein kleines Manko ist. grinsen Könnte nicht mehr ohne VA coden...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz