1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
| if (fullscreen) //We zitten in fullscreen mode
{
dwExStyle = WS_EX_APPWINDOW; //Window Extended stijl
dwStyle = WS_POPUP; //Windows Stijl
ShowCursor(false);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //Window Extended stijl
dwStyle = WS_OVERLAPPEDWINDOW; //Window stijl
}
AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle); //Maak window aangevraagde grootte
if (!(hWnd = CreateWindowEx( dwExStyle, //Extended stijl voor het window
"WouterGL", //Class naam
title, //Window titel
dwStyle | //Geselecteerde window stijl
WS_CLIPSIBLINGS | //Noodzakelijk
WS_CLIPCHILDREN , //Noodzakelijk
0, 0, //Window positie
WindowRect.right - WindowRect.left, //Bereken window breedte
WindowRect.bottom - WindowRect.top, //Bereken window hoogte
NULL, //Geen parent window
NULL, //Geen menu
hInstance, //Instance
NULL))) //Laat niets over op WM_CREATE
{
KillGLWindow(); //Reset het display
MessageBox(NULL,"Window Creation Error.","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
static PIXELFORMATDESCRIPTOR pfd = //pft verteld windows hoe we dingen willen zien
{
sizeof(PIXELFORMATDESCRIPTOR), //Grootte van de PFD
1, //Versie nummer
PFD_DRAW_TO_WINDOW| //PDF moet window ondersteunen
PFD_SUPPORT_OPENGL| //PDF moet OpenGL ondersteunen
PFD_DOUBLEBUFFER, //Moet doublebuffering ondersteunen
PFD_TYPE_RGBA, //Een RGBA aanvragen
bits, //Selecteer een kleur diepte
0, 0, 0, 0, 0, 0, //Kleur bits negeren
0, //Geen alpha buffer
0, //Shitf bit negeren
0, //Geen accumulation buffer
0, 0, 0, 0, //Accumulation Bits negeren
16, //16Bit Z-Buffer (Diepte buffer)
0, //Geen stencil buffer
0, //Geen Auxiliary Buffer
PFD_MAIN_PLANE, //Main teken laag
0, //Gereserveerd
0, 0, 0 //Layer masks negeren
};
if (!(hDC = GetDC(hWnd))) //Kijkt of we een Device Context hebben
{
KillGLWindow(); //Reset het window
MessageBox(NULL,"Can't create a GL Device Context.","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
if (!(PixelFormat=ChoosePixelFormat(hDC, &pfd))) //Kijkt of windows het juiste pixeltype kan vinden
{
KillGLWindow(); //Reset het window
MessageBox(NULL,"Can't find suitable pixel format","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
if (!(hRC=wglCreateContext(hDC))) //Kijkt of we Rendering Context kunnen krijgen
{
KillGLWindow(); //Reset het window
MessageBox(NULL,"Can't create a GL Rendering Context.","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
if (!wglMakeCurrent(hDC,hRC)) //Kijkt of de Rendering Context geactiveerd kan worden
{
KillGLWindow(); //Reset het window
MessageBox(NULL,"Can't activate the GL Rendering Context.","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
ShowWindow(hWnd,SW_SHOW); //Laat het scherm zien
SetForegroundWindow(hWnd); //Verhoog de prioriteit
SetFocus(hWnd); //Keyboard focus op het window
ReSizeGLScene(width, height); //Zet het window in perspectief op
if (!InitGL()) //Initialiseer het nieuwe GL window
{
KillGLWindow(); //Reset het window
MessageBox(NULL,"Initialization failed.","Error",MB_OK | MB_ICONEXCLAMATION);
return false; //Return false
}
return true; //Alles ging goed
}
LRESULT CALLBACK WndProc( HWND hWnd, //Handle voor dit window
UINT uMsg, //Bericht voor dit window
WPARAM wParam, //Bijkomende bericht informatie
LPARAM lParam) //Bijkomende bericht informatie
{
switch (uMsg) //Check voor window berichten
{
case WM_ACTIVATE: //Kijk naar window activatie bericht
{
if (!HIWORD(wParam)) //Check minimalisatie status
{
active = true; //Programma is actief
}
else
{
active = false; //Programma is niet meer actief
}
return 0; //Return de message lus
}
case WM_SYSCOMMAND: //Onderschept systeem commando's
{
switch (wParam) //Check system oproepen
{
case SC_SCREENSAVE: //Kijkt of screensaver probeert te starten
case SC_MONITORPOWER: //Kijkt of de monitor op standby wil gaan
return 0; //Zorgt ervoor dat het niet zal gebeuren
}
break; //Exit
}
case WM_CLOSE: //Kijkt of een we een sluit bericht hebben gekregen
{
PostQuitMessage(0); //Stuurt een afsluit bericht
return 0; //Spring terug
}
case WM_KEYDOWN: //Kijkt of er een toets wordt ingedrukt
{
keys[wParam] = false; //Als het zo is wordt het als false gemarkeerd
return 0; //Spring terug
}
case WM_KEYUP: //Kijkt of er een toets wordt losgelaten
{
keys[wParam] = false; //Als het zo is wordt het als false gemarkeerd
return 0; //Spring terug
}
case WM_SIZE: //Resize het window
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); //LoWord = width, HiWord = height
return 0; //Spring terug
}
}
//Geef alle onbehandelde berichten door aan windows
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
//HIER START WinAPI
int WINAPI WinMain( HINSTANCE hInstance, //Instance
HINSTANCE hPrevInstance, //Previous instance
LPSTR lpCmdLine, //Command line parameters
int nCmdShow) //Window toon status
{
MSG msg; //Window bericht structuur
BOOL done = false; //Bool variable voor exit lus
// Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Choose window mode.",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen = false; // Windowed Mode
}
//Maak het window
if (!CreateGLWindow("WouterGL Framework",640,480,16,fullscreen))
{
return 0; //Sluit af wanneer window niet gemaakt is
}
while (!done) //Loop totdat done = true
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //Kijkt of er een bericht is
{
if (msg.message==WM_QUIT) //Kijkt of er een afsluit bericht ontvangen is
{
done = true; //Als het zo is, done = true
}
else //Als er geen afsluit bericht ontvangen is: Handel de andere window berichten af
{
TranslateMessage(&msg); //Vertaal het bericht
DispatchMessage(&msg); //Dispatch het bericht
}
}
else
{
//Teken het beeld. Kijk uit naar ESC of afsluit berichten door DrawGLScene()
if (active) //Kijkt of het programma actief is
{
if (keys[VK_ESCAPE]) //Kijkt of ESC wordt ingedrukt
{
done = true; //ESC heeft een quit doorgegeven
}
else
{
DrawGLScene(); //Tekent het beeld
SwapBuffers(hDC); //Verwissel buffers (Double-Buffering)
}
}
if (keys[VK_F1]) //Kijkt of F1 is ingedrukt
{
keys[VK_F1] = false; //Als F1 ingedrukt is maak het dan false
KillGLWindow(); //Sluit huidige scherm af
fullscreen = !fullscreen; //Kies tussen windowed / fullscreen modus
//Maak opnieuw OpenGL scherm aan
if (!CreateGLWindow("WouterGL",640,480,16,fullscreen))
{
return 0; //Sluit af als het scherm niet creert kan worden
}
}
}
}
// Afsluiten
KillGLWindow(); //Sluit het schermpje
return (msg.wParam); //Sluit het programma
} |