153 lines
3.1 KiB
C
153 lines
3.1 KiB
C
#include <windows.h>
|
|
#include <GL/gl.h>
|
|
|
|
// Global variables
|
|
HINSTANCE hInstance;
|
|
HWND hWnd;
|
|
HDC hDC;
|
|
HGLRC hRC;
|
|
|
|
// Forward declarations
|
|
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
|
void EnableOpenGL(HWND, HDC*, HGLRC*);
|
|
void DisableOpenGL(HWND, HDC, HGLRC);
|
|
|
|
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
|
{
|
|
// Register the window class
|
|
WNDCLASSEX wc = {
|
|
sizeof(WNDCLASSEX),
|
|
CS_CLASSDC,
|
|
WndProc,
|
|
0L,
|
|
0L,
|
|
hInst,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
"GLSample",
|
|
NULL
|
|
};
|
|
RegisterClassEx(&wc);
|
|
|
|
// Create the window
|
|
hWnd = CreateWindowEx(
|
|
0,
|
|
"GLSample",
|
|
"OpenGL Sample",
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
256,
|
|
256,
|
|
NULL,
|
|
NULL,
|
|
hInst,
|
|
NULL
|
|
);
|
|
|
|
// Enable OpenGL
|
|
EnableOpenGL(hWnd, &hDC, &hRC);
|
|
|
|
// Show the window
|
|
ShowWindow(hWnd, nCmdShow);
|
|
UpdateWindow(hWnd);
|
|
|
|
// Main loop
|
|
MSG msg;
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
// Disable OpenGL
|
|
DisableOpenGL(hWnd, hDC, hRC);
|
|
|
|
// Clean up
|
|
UnregisterClass("GLSample", hInstance);
|
|
return msg.wParam;
|
|
}
|
|
|
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_CLOSE:
|
|
PostQuitMessage(0);
|
|
break;
|
|
case WM_SIZE:
|
|
glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
|
|
break;
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT ps;
|
|
BeginPaint(hWnd, &ps);
|
|
|
|
// Clear the screen
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
// Draw a triangle
|
|
glBegin(GL_TRIANGLES);
|
|
glColor3f(1.0f, 0.0f, 0.0f);
|
|
glVertex2f(-0.5f, -0.5f);
|
|
glColor3f(0.0f, 1.0f, 0.0f);
|
|
glVertex2f(0.5f, -0.5f);
|
|
glColor3f(0.0f, 0.0f, 1.0f);
|
|
glVertex2f(0.0f, 0.5f);
|
|
glEnd();
|
|
|
|
// Swap buffers
|
|
SwapBuffers(hDC);
|
|
|
|
EndPaint(hWnd, &ps);
|
|
}
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void EnableOpenGL(HWND hWnd, HDC* hDC, HGLRC* hRC)
|
|
{
|
|
*hDC = GetDC(hWnd);
|
|
|
|
// Set the pixel format
|
|
PIXELFORMATDESCRIPTOR pfd = {
|
|
sizeof(PIXELFORMATDESCRIPTOR),
|
|
1,
|
|
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
|
|
PFD_TYPE_RGBA,
|
|
32,
|
|
0, 0, 0, 0, 0, 0,
|
|
0,
|
|
0,
|
|
0,
|
|
0, 0, 0, 0,
|
|
16,
|
|
0,
|
|
0,
|
|
PFD_MAIN_PLANE,
|
|
0,
|
|
0, 0, 0
|
|
};
|
|
|
|
int iFormat = ChoosePixelFormat(*hDC, &pfd);
|
|
SetPixelFormat(*hDC, iFormat, &pfd);
|
|
|
|
// Create the OpenGL context
|
|
*hRC = wglCreateContext(*hDC);
|
|
wglMakeCurrent(*hDC, *hRC);
|
|
}
|
|
|
|
void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
|
|
{
|
|
wglMakeCurrent(NULL, NULL);
|
|
wglDeleteContext(hRC);
|
|
ReleaseDC(hWnd, hDC);
|
|
}
|
|
|