|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.08.2012, 22:01 Titel: DevC++ und MinGW |
|
|
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 )
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.08.2012, 22:43 Titel: Re: DevC++ und MinGW |
|
|
Eternal_pain hat Folgendes geschrieben: | nahezu alle libs explizit 'linken' muss (was mir ziemlich bescheuert erscheint ) |
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 |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2012, 00:07 Titel: |
|
|
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 |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 07.08.2012, 00:40 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.08.2012, 02:16 Titel: |
|
|
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 |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2012, 02:54 Titel: |
|
|
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 |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 07.08.2012, 08:57 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.08.2012, 16:53 Titel: |
|
|
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. 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 |
|
|
|
|
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.
|
|