Code:
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#include "global.h"
#include "structures.h"
#include "gl.h"
#define SKY_WIDTH 640
#define SKY_HEIGHT 480
LONG APIENTRY WndProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam);
GLvoid KillGLWindow(GLvoid);
BOOL CreateGLWindow(char* title, int width, int height, int bits);
/***globals***/
struct Global *G;
HDC hdc = NULL;
HGLRC hrc = NULL;
HWND hwnd = NULL;
HINSTANCE hInstance;
/***********
****code****
***********/
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow )
{
//declaratie variabelen
MSG msg;
char *appName = "Sky";
//G een geheugenplaats toewijzen
G = (Global *)malloc(sizeof(Global));
initGlobal(G);
//venster creëren
CreateGLWindow(appName, SKY_WIDTH, SKY_HEIGHT, 16);
//main lus
/******************************************/
/*****************problemare..........******************/
/******************************************/
while (!G->st->done)
{
if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
G->st->done = 1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
switch (G->ev->key)
{
case SKY_R:
if (G->ev->syskey & SKY_CTRL){
G->st->fullscreen = 1;
KillGLWindow();
CreateGLWindow(appName, SKY_WIDTH, SKY_HEIGHT, 16);
}
break;
case SKY_ESC:
G->st->done = 1;
break;
case SKY_Q:
if (G->ev->syskey & SKY_CTRL &&
G->ev->syskey & SKY_SHIFT &&
G->ev->syskey & SKY_ALT) G->st->done = 1;
break;
}
}
/******************************************/
/*****************problemare..........******************/
/******************************************/
KillGLWindow();
return msg.wParam;
}
/**************************************************************************************/
//windows event procedure
LONG APIENTRY WndProc (HWND hwnd,
UINT msg,
UINT wParam,
LONG lParam)
{
switch (msg)
{
case WM_KEYDOWN:
switch (wParam)
{
case 81: //Q
G->ev->key = SKY_Q;
return 0;
case 82: //R
G->ev->key = SKY_R;
return 0;
case VK_UP: //Pijltje Boven
G->ev->key = SKY_UP;
return 0;
case VK_RIGHT: //Pijltje Rechts
G->ev->key = SKY_RIGHT;
return 0;
case VK_DOWN: //Pijltje Onder
G->ev->key = SKY_DOWN;
return 0;
case VK_LEFT: //Pijltje Links
G->ev->key = SKY_LEFT;
return 0;
case VK_ESCAPE: //Escape
G->ev->key = SKY_ESC;
return 0;
case VK_RETURN:
G->ev->key = SKY_RETURN;
return 0;
case VK_CONTROL: //Control
G->ev->syskey |= SKY_CTRL;
return 0;
case VK_SHIFT: //Shift
G->ev->syskey |= SKY_SHIFT;
return 0;
case VK_MENU: //Alt
G->ev->syskey |= SKY_ALT;
return 0;
}
case WM_KEYUP:
switch (wParam)
{
case VK_CONTROL:
G->ev->syskey &= ~SKY_CTRL;
return 0;
case VK_SHIFT:
G->ev->syskey &= ~SKY_SHIFT;
return 0;
case VK_MENU:
G->ev->syskey &= ~SKY_ALT;
return 0;
default:
G->ev->key = 0;
return 0;
}
case WM_PAINT:
//UpdateWindow (hwnd);
return 0;
case WM_CLOSE:
case WM_DESTROY:
G->st->done = 1;
return 0;
default:
return (DefWindowProc (hwnd, msg, wParam, lParam));
}
return (1);
}
/**************************************************************************************/
void KillGLWindow()
{
if (G->st->fullscreen)
{
//terug naar gewone desktop settings
ChangeDisplaySettings(NULL,0);
ShowCursor(1);
//alles afsluiten en unregistreren
if (hrc){
if (!wglMakeCurrent(NULL,NULL)){
MessageBox(NULL,"Release Of DC And RC Failed.", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hrc)){
MessageBox(NULL,"Release Rendering Context Failed.", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hrc = NULL;
}
if (hdc && !ReleaseDC(hwnd,hdc)){
MessageBox(NULL,"Release Device Context Failed.", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hdc = NULL;
}
if (hwnd && !DestroyWindow(hwnd)){
MessageBox(NULL,"Could Not Release hWnd.", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hwnd = NULL;
}
if (!UnregisterClass("Sky",hInstance)){
MessageBox(NULL,"Could Not Unregister Class.", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hInstance = NULL;
}
}
}
/**************************************************************************************/
int CreateGLWindow(char* title, int width, int height, int bits)
{
//declaratie variabelen
GLuint PixelFormat;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
PIXELFORMATDESCRIPTOR pfd;
WNDCLASS wc;
//client rechthoek
WindowRect.left = (long)0;
WindowRect.right = (long)width;
WindowRect.top = (long)0;
WindowRect.bottom = (long)height;
//registreren van venster klasse
hInstance = GetModuleHandle(NULL);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "Sky";
if (!RegisterClass (&wc)){
MessageBox (NULL,"Failed To Register The Window Class.", "ERROR",MB_OK|MB_ICONEXCLAMATION);
return 0;
}
//fullscreen settings invullen
if (G->st->fullscreen)
{
//set screensettings
DEVMODE dmScreenSettings;
memset (&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = width;
dmScreenSettings.dmPelsHeight = height;
dmScreenSettings.dmBitsPerPel = bits;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
//verander screensettings
if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL){
if (MessageBox (NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?", "OPENGL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES){
G->st->fullscreen = 0;
}
else{
MessageBox (NULL,"Program Will Now Close.", "ERROR",MB_OK|MB_ICONSTOP);
return 0;
}
}
}
//windows stijlen invullen
if (G->st->fullscreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor(0);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(&WindowRect, dwStyle, 0, dwExStyle);
//maak het window
if (!(hwnd = CreateWindowEx( dwExStyle,
"Sky",
title,
dwStyle |
WS_CLIPSIBLINGS |
WS_CLIPCHILDREN,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
NULL,
NULL,
hInstance,
NULL)))
{
KillGLWindow(); // Reset The Display
MessageBox (NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
//pixelformatdescriptor
memset(&pfd, 0, sizeof (PIXELFORMATDESCRIPTOR));
pfd.nVersion = 1;
pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR);
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = bits;
//device context ?
if (!(hdc = GetDC (hwnd))){
KillGLWindow();
MessageBox (NULL, "Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
//goed pixelformaat ?
if (!(PixelFormat = ChoosePixelFormat (hdc, &pfd))){
KillGLWindow();
MessageBox (NULL, "Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
//pixelformaat gezet ?
if (!SetPixelFormat (hdc, PixelFormat, &pfd)){
KillGLWindow();
MessageBox (NULL, "Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
//rendering context ?
if (!(hrc = wglCreateContext (hdc))){
KillGLWindow();
MessageBox (NULL, "Can't Create A GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
//activeer render context
if(!wglMakeCurrent (hdc,hrc)){
KillGLWindow();
MessageBox (NULL, "Can't Activate The GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
G->st->done = 1;
return 0;
}
ShowWindow (hwnd,SW_SHOW);
SetForegroundWindow (hwnd);
SetFocus (hwnd);
resizeScene (width, height);
if (!initGl()){
KillGLWindow();
G->st->done = 1;
return 0;
}
return 1;
}
When pressing CTRL-R, this code is executed :