I am trying to write an openGL application from a tutorial I found and tried to copy it as accurately as possible without just copy+pasting it, so I can actually learn the code. The source file from the tutorial compiles and runs perfectly, but my code fails at a call of CreateWindowEx().
Here is just that code:
hWnd = CreateWindowEx(dwExStyle,
lpszClassName,
title,
dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0,
0,
WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
{
KillGLWindow();
MessageBox(NULL, "Failed to create window.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
It always call the message box.
Here is the entire code:
#include <windows.h>
#include <GL/glu.h>
#include <GL/gl.h>
HDC hDC = NULL;
HGLRC hRC = NULL;
HWND hWnd = NULL;
HINSTANCE hInstance;
LPSTR lpszClassName = "WndClass";
bool keys[256];
bool active = true;
bool fullscreen = true;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
GLvoid ResizeGLScene(GLsizei width, GLsizei height)
{
if(height == 0)
{
height = 1;
}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Calculate aspect ratio
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int InitGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 2nd arg: (GL_NICEST | GL_FASTEST)
return TRUE;
}
int DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
return TRUE;
}
GLvoid KillGLWindow()
{
if(fullscreen)
{
ChangeDisplaySettings(NULL, 0);
ShowCursor(true);
}
if(hRC)
{
if(!wglMakeCurrent(NULL, NULL))
{
MessageBox(NULL, "Failed to release DC and RC.", "Error!", MB_ICONEXCLAMATION | MB_OK);
}
if(!wglDeleteContext(hRC))
{
MessageBox(NULL, "Failed to delete RC.", "Error!", MB_ICONEXCLAMATION | MB_OK);
}
hRC = NULL;
}
if(hDC && !ReleaseDC(hWnd, hDC))
{
MessageBox(NULL, "Failed to release DC.", "Error!", MB_ICONEXCLAMATION | MB_OK);
hDC = NULL;
}
if(hWnd && !DestroyWindow(hWnd))
{
MessageBox(NULL, "Failed to destroy window.", "Error!", MB_ICONEXCLAMATION | MB_OK);
hWnd = NULL;
}
if(!UnregisterClass(lpszClassName, hInstance))
{
MessageBox(NULL, "Failed to unregister window class.", "Error!", MB_ICONEXCLAMATION | MB_OK);
hInstance = NULL;
}
}
bool CreateGLWindow(char *title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
WindowRect.left = (long)0;
WindowRect.right = (long)width;
WindowRect.top = (long)0;
WindowRect.bottom = (long)height;
fullscreen = fullscreenflag;
hInstance = GetModuleHandle(NULL);
if(!hInstance)
{
MessageBox(NULL, "Failed to get module handle.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszClassName;
if(!RegisterClass(&wc))
{
MessageBox(NULL, "Failed to register window class.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
if(fullscreen)
{
DEVMODE dmode;
memset(&dmode, 0, sizeof(dmode));
dmode.dmSize = sizeof(dmode);
dmode.dmPelsWidth = width;
dmode.dmPelsHeight = height;
dmode.dmBitsPerPel = bits;
dmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
if(ChangeDisplaySettings(&dmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
if(MessageBox(NULL, "The requested fullscreen mode is not supported by\nyour video card. Use windowed mode instead?", title, MB_ICONEXCLAMATION | MB_YESNO) == IDYES)
{
fullscreen = false;
}
else
{
MessageBox(NULL, "Program will now close.", title, MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
}
}
if(fullscreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor(FALSE);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
hWnd = CreateWindowEx(dwExStyle,
lpszClassName,
title,
dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0,
0,
WindowRect.right - WindowRect.left,
WindowRect.bottom - WindowRect.top,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
{
KillGLWindow();
MessageBox(NULL, "Failed to create window.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
static PIXELFORMATDESCRIPTOR pfd;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = bits;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
hDC = GetDC(hWnd);
if(!hDC)
{
KillGLWindow();
MessageBox(NULL, "Failed to get device context.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
PixelFormat = ChoosePixelFormat(hDC, &pfd);
if(!PixelFormat)
{
KillGLWindow();
MessageBox(NULL, "Failed to find pixel format.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
if(!SetPixelFormat(hDC, PixelFormat, &pfd))
{
KillGLWindow();
MessageBox(NULL, "Failed to set pixel format.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
hRC = wglCreateContext(hDC);
if(!hRC)
{
KillGLWindow();
MessageBox(NULL, "Failed to create rendering context.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
if(!wglMakeCurrent(hDC, hRC))
{
KillGLWindow();
MessageBox(NULL, "Failed to activate rendering context.", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
ShowWindow(hWnd, SW_SHOW);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
ResizeGLScene(width, height);
if(!InitGL())
{
KillGLWindow();
MessageBox(NULL, "Failed to inititalize GL window", "Error!", MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_ACTIVATE:
{
if(!HIWORD(wParam))
{
active = TRUE;
}
else
{
active = FALSE;
}
return 0;
}
case WM_SYSCOMMAND:
{
switch(wParam)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break;
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_KEYDOWN:
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP:
{
keys[wParam] = FALSE;
return 0;
}
case WM_SIZE:
{
ResizeGLScene(LOWORD(lParam), HIWORD(lParam));
return 0;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
BOOL quit = FALSE;
/*
if(MessageBox(NULL, "Would you like to run in fullscreen mode?", "Start FullScreen?", MB_YESNO | MB_ICONQUESTION) == IDNO)
{
fullscreen=FALSE; // Windowed Mode
}
*/
if(!CreateGLWindow("OpenGl Window", 640, 480, 16, fullscreen))
{
return 0;
}
while(!quit)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
quit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
if(active)
{
if(keys[VK_ESCAPE])
{
quit = true;
}
else
{
DrawGLScene();
SwapBuffers(hDC);
}
}
if(keys[VK_F1])
{
keys[VK_F1] = FALSE;
KillGLWindow();
fullscreen = !fullscreen;
if(!CreateGLWindow("OpenGL Window", 1024, 768, 16, fullscreen))
{
return 0;
}
}
}
}
KillGLWindow();
return msg.wParam;
}
The tutorial is here: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01
I can't for the life of me figure out what is different (that would cause this error).