83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
#include <windows.h>
|
|
#include "../deps/include/glad/glad.h"
|
|
#include <stdio.h>
|
|
|
|
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
HGLRC CreateOpenGLContext(HWND hwnd, HDC hdc) {
|
|
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, 24, 8, 0,
|
|
PFD_MAIN_PLANE, 0, 0, 0, 0
|
|
};
|
|
|
|
int pf = ChoosePixelFormat(hdc, &pfd);
|
|
SetPixelFormat(hdc, pf, &pfd);
|
|
return wglCreateContext(hdc);
|
|
}
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
|
const char CLASS_NAME[] = "WGLSampleWindow";
|
|
|
|
WNDCLASS wc = {0};
|
|
wc.lpfnWndProc = WindowProc;
|
|
wc.hInstance = hInstance;
|
|
wc.lpszClassName = CLASS_NAME;
|
|
RegisterClass(&wc);
|
|
|
|
HWND hwnd = CreateWindowEx(0, CLASS_NAME, "OpenGL with WGL and GLAD", WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
|
|
|
|
if (!hwnd) return -1;
|
|
|
|
HDC hdc = GetDC(hwnd);
|
|
HGLRC hglrc = CreateOpenGLContext(hwnd, hdc);
|
|
wglMakeCurrent(hdc, hglrc);
|
|
|
|
// Load OpenGL functions using GLAD
|
|
if (!gladLoadGL()) {
|
|
MessageBoxA(NULL, "Failed to initialize GLAD", "Error", MB_OK | MB_ICONERROR);
|
|
return -1;
|
|
}
|
|
|
|
ShowWindow(hwnd, nCmdShow);
|
|
|
|
// Main loop
|
|
MSG msg;
|
|
while (1) {
|
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
|
if (msg.message == WM_QUIT) goto cleanup;
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
// OpenGL rendering
|
|
glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
SwapBuffers(hdc);
|
|
}
|
|
|
|
cleanup:
|
|
wglMakeCurrent(NULL, NULL);
|
|
wglDeleteContext(hglrc);
|
|
ReleaseDC(hwnd, hdc);
|
|
DestroyWindow(hwnd);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
switch (uMsg) {
|
|
case WM_CLOSE:
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
case WM_DESTROY:
|
|
return 0;
|
|
default:
|
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
}
|