Zdravím,
Nevím co už dělat, ale stále jsem ještě nespustil ani jednu aplikaci opengl. Prošel jsem snad stovky zdrojových kódu, návodu a už nevím čeho všeho. Avšak poslední kód který teď mám rozjetý v dev cpp není vyjímkou. Píše mi to tyhle chyby:
D:\Knihovny\Plocha\main.cpp In function `GLvoid KillGLWindow()':
77 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token
77 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token
252 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token
252 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token
309 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token
309 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token
369 D:\Knihovny\Plocha\main.cpp `msg' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
369 D:\Knihovny\Plocha\main.cpp return-statement with a value, in function returning 'void'
D:\Knihovny\Plocha\Makefile.win [Build Error] [main.o] Error 1
Už toho mám plné zuby. Začíná mi to připadat jak v linuxu. Věčně tomu něco chybí k tomu aby to běželo. Nemám nejmenší tušení co s tím je. Tady je kód:
#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glaux.lib")
#include <windows.h>// Hlavi?kový soubor pro Windows
#include <gl\gl.h>// Hlavi?kový soubor pro OpenGL32 knihovnu
#include <gl\glu.h>// Hlavi?kový soubor pro Glu32 knihovnu
#include <gl\glaux.h>// Hlavi?kový soubor pro Glaux knihovnu
HDC hDC = NULL;// Privátní GDI Device Context
HGLRC hRC = NULL;// Trvalý Rendering Context
HWND hWnd = NULL;// Obsahuje Handle našeho okna
HINSTANCE hInstance;// Obsahuje instanci aplikace
bool keys[256];// Pole pro ukládání vstupu z klávesnice
bool active = TRUE;// Ponese informaci o tom, zda je okno aktivní
bool fullscreen = TRUE;// Ponese informaci o tom, zda je program ve fullscreenu
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// Deklarace procedury okna (funk?ní prototyp)
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// Zm?na velikosti a inicializace OpenGL okna
{
if (height==0)// Zabezpe?ení proti d?lení nulou
{
height=1;// Nastaví výšku na jedna
}
glViewport(0,0,width,height);// Resetuje aktuální nastavení
glMatrixMode(GL_PROJECTION);// Zvolí projek?ní matici
glLoadIdentity();// Reset matice
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);// Výpo?et perspektivy
glMatrixMode(GL_MODELVIEW);// Zvolí matici Modelview
glLoadIdentity();// Reset matice
}
int InitGL(GLvoid)// Všechno nastavení OpenGL
{
glShadeModel(GL_SMOOTH);// Povolí jemné stínování
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// ?erné pozadí
glClearDepth(1.0f);// Nastavení hloubkového bufferu
glEnable(GL_DEPTH_TEST);// Povolí hloubkové testování
glDepthFunc(GL_LEQUAL);// Typ hloubkového testování
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Nejlepší perspektivní korekce
return TRUE;// Inicializace prob?hla v po?ádku
}
int DrawGLScene(GLvoid)// Vykreslování
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Smaže obrazovku a hloubkový buffer
glLoadIdentity();// Reset matice
// Sem m?žete kreslit
return TRUE;// Vykreslení prob?hlo v po?ádku
}
GLvoid KillGLWindow(GLvoid)// Zavírání okna
{
if (fullscreen)// Jsme ve fullscreenu?
{
ChangeDisplaySettings(NULL,0);// P?epnutí do systému
ShowCursor(TRUE);// Zobrazí kurzor myši
}
if (hRC)// Máme rendering kontext?
{
if (!wglMakeCurrent(NULL,NULL))// Jsme schopni odd?lit kontexty?
{
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC))// Jsme schopni smazat RC?
{
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL;// Nastaví hRC na NULL
}
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat;// Ukládá formát pixel?
WNDCLASS wc;// Struktura Windows Class
DWORD dwExStyle;// Rozší?ený styl okna
DWORD dwStyle;// Styl okna
RECT WindowRect;// Obdélník okna
WindowRect.left = (long)0;// Nastaví levý okraj na nulu
WindowRect.right = (long)width;// Nastaví pravý okraj na zadanou hodnotu
WindowRect.top = (long)0;// Nastaví horní okraj na nulu
WindowRect.bottom = (long)height;// Nastaví spodní okraj na zadanou hodnotu
fullscreen = fullscreenflag;// Nastaví prom?nnou fullscreen na správnou hodnotu
hInstance = GetModuleHandle(NULL);// Získá instanci okna
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;// P?ekreslení p?i zm?n? velikosti a vlastní DC
wc.lpfnWndProc = (WNDPROC) WndProc;// Definuje proceduru okna
wc.cbClsExtra = 0;// Žádná extra data
wc.cbWndExtra = 0;// Žádná extra data
wc.hInstance = hInstance;// Instance
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);// Standardní ikona
wc.hCursor = LoadCursor(NULL, IDC_ARROW);// Standardní kurzor myši
wc.hbrBackground = NULL;// Pozadí není nutné
wc.lpszMenuName = NULL;// Nechceme menu
wc.lpszClassName = "OpenGL";// Jméno t?ídy okna
if (!RegisterClass(&wc))// Registruje t?ídu okna
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// P?i chyb? vrátí false
}
if (fullscreen)// Budeme ve fullscreenu?
{
DEVMODE dmScreenSettings;// Mód za?ízení
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));// Vynulování pam?ti
dmScreenSettings.dmSize=sizeof(dmScreenSettings);// Velikost struktury Devmode
dmScreenSettings.dmPelsWidth= width;// Ší?ka okna
dmScreenSettings.dmPelsHeight= height;// Výška okna
dmScreenSettings.dmBitsPerPel= bits;// Barevná hloubka
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Pokusí se použít práv? definované nastavení
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// Nejde-li fullscreen, m?že uživatel spustit program v okn? nebo ho opustit
if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|
MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;// B?h v okn?
}
else
{
// Zobrazí uživateli zprávu, že program bude ukon?en
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
return FALSE;// Vrátí FALSE
}
}
}
if (fullscreen)// Jsme stále ve fullscreenu?
{
dwExStyle=WS_EX_APPWINDOW;// Rozší?ený styl okna
dwStyle=WS_POPUP;// Styl okna
ShowCursor(FALSE);// Skryje kurzor
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;// Rozší?ený styl okna
dwStyle=WS_OVERLAPPEDWINDOW;// Styl okna
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// P?izp?sobení velikosti okna
// Vytvo?ení okna
if (!(hWnd=CreateWindowEx(dwExStyle,// Rozší?ený styl
"OpenGL",// Jméno t?ídy
title,// Titulek
dwStyle |// Definovaný styl
WS_CLIPSIBLINGS |// Požadovaný styl
WS_CLIPCHILDREN,// Požadovaný styl
0, 0,// Pozice
WindowRect.right-WindowRect.left,// Výpo?et ší?ky
WindowRect.bottom-WindowRect.top,// Výpo?et výšky
NULL,// Žádné rodi?ovské okno
NULL,// Bez menu
hInstance,// Instance
NULL)))// Nep?edat nic do WM_CREATE
{
KillGLWindow();// Zruší okno
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Vrátí chybu
}
static PIXELFORMATDESCRIPTOR pfd=// Oznámíme Windows jak chceme vše nastavit
{
sizeof(PIXELF ORMATDESCRIPTOR),// Velikost struktury
1,// ?íslo verze
PFD_DRAW_TO_WINDOW |// Podpora okna
PFD_SUPPORT_OPENGL |// Podpora OpenGL
PFD_DOUBLEBUFFER,// Podpora Double Bufferingu
PFD_TYPE_RGBA,// RGBA Format
bits,// Zvolí barevnou hloubku
0, 0, 0, 0, 0, 0,// Bity barev ignorovány
0,// Žádný alpha buffer
0,// Ignorován Shift bit
0,// Žádný akumula?ní buffer
0, 0, 0, 0,// Akumula?ní bity ignorovány
16,// 16-bitový hloubkový buffer (Z-Buffer)
0,// Žádný Stencil Buffer
0,// Žádný Auxiliary Buffer
PFD_MAIN_PLANE,// Hlavní vykreslovací vrstva
0,// Rezervováno
0, 0, 0// Maska vrstvy ignorována
};
if (!(hDC=GetDC(hWnd)))// Poda?ilo se p?ipojit kontext za?ízení?
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// Poda?ilo se najít Pixel Format?
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))// Poda?ilo se nastavit Pixel Format?
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
if (!(hRC=wglCreateContext(hDC)))// Poda?ilo se vytvo?it Rendering Context?
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
if(!wglMakeCurrent(hDC,hRC))// Poda?ilo se aktivovat Rendering Context?
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
ShowWindow(hWnd,SW_SHOW);// Zobrazení okna
SetForegroundWindow(hWnd);// Do pop?edí
SetFocus(hWnd);// Zam??í fokus
ReSizeGLScene(width, height);// Nastavení perspektivy OpenGL scény
if (!InitGL())// Inicializace okna
{
KillGLWindow();// Zav?e okno
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;// Ukon?í program
}
return TRUE;// Vše prob?hlo v po?ádku
}
LRESULT CALLBACK WndProc(HWND hWnd,// Handle okna
UINT uMsg,// Zpráva pro okno
WPARAM wParam,// Dopl?kové informace
LPARAM lParam)// Dopl?kové informace
{
switch (uMsg);// V?tvení podle p?íchozí zprávy
{
case WM_ACTIVATE:// Zm?na aktivity okna
{
if (!HIWORD(wParam))// Zkontroluje zda není minimalizované
{
active=TRUE;// Program je aktivní
}
else{
active=FALSE;// Program není aktivní
}
return 0;// Návrat do hlavního cyklu programu
}
case WM_SYSCOMMAND:// Systémový p?íkaz
{
switch (wParam)// Typ systémového p?íkazu
{
case SC_SCREENSAVE:// Pokus o zapnutí šet?i?e obrazovky
case SC_MONITORPOWER:// Pokus o p?echod do úsporného režimu?
return 0;// Zabrání obojímu
}
break;// Návrat do hlavního cyklu programu
}
case WM_CLOSE:// Povel k ukon?ení programu
{
PostQuitMessage(0);// Pošle zprávu o ukon?ení
return 0;// Návrat do hlavního cyklu programu
}
case WM_KEYDOWN:// Stisk klávesy
{
keys[wParam] = TRUE;// Oznámí to programu
return 0;// Návrat do hlavního cyklu programu
}
case WM_KEYUP:// Uvoln?ní klávesy
{
keys[wParam] = FALSE;// Oznámí to programu
return 0;// Návrat do hlavního cyklu programu
}
case WM_SIZE:// Zm?na velikosti okna
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Ší?ka, HiWord=Výška
return 0;// Návrat do hlavního cyklu programu
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);// P?edání ostatních zpráv systému
}
int WINAPI WinMain(HINSTANCE hInstance,// Instance
HINSTANCE hPrevInstance,// P?edchozí instance
LPSTR lpCmdLine,// Parametry p?íkazové ?ádky
int nCmdShow)// Stav zobrazení okna
{
MSG msg;// Struktura zpráv systému
BOOL done=FALSE;// Prom?nná pro ukon?ení programu
// Dotaz na uživatele pro fullscreen/okno
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?", MB_YESNO | MB_ICONQUESTION) == IDNO)
{
fullscreen=FALSE;// B?h v okn?
}
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))// Vytvo?ení OpenGL okna
{
return 0;// Konec programu p?i chyb?
}
while(!done)// Hlavní cyklus programu
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))// P?išla zpráva?
{
if (msg.message==WM_QUIT)// Obdrželi jsme zprávu pro ukon?ení?
{
done=TRUE;// Konec programu
}
else// P?edáme zprávu procedu?e okna
{
TranslateMessage(&msg);// P?eloží zprávu
DispatchMessage(&msg);// Odešle zprávu
}
}
else
{
if (active)// Je program aktivní?
{
if (keys[VK_ESCAPE])// Byl stisknut ESC?
{
done=TRUE;// Ukon?íme program
}
}
else// P?ekreslení scény
{
DrawGLScene();// Vykreslení scény
SwapBuffers(hDC);// Prohození buffer? (Double Buffering)
}
if (keys[VK_F1])// Byla stisknuta klávesa F1?
{
keys[VK_F1]=FALSE;// Ozna? ji jako nestisknutou
KillGLWindow();// Zruší okno
fullscreen=!fullscreen;// Negace fullscreen
// Znovuvytvo?ení okna
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;// Konec programu pokud nebylo vytvo?eno
}
}
}
}
}
KillGLWindow();// Zav?e okno
return (msg.wParam);// Ukon?ení programu
}