Created
March 11, 2012 12:37
-
-
Save mobius/2016283 to your computer and use it in GitHub Desktop.
minimum file for create a opengl context
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* An example of the minimal Win32 & OpenGL program. It only works in | |
16 bit color modes or higher (since it doesn't create a | |
palette). */ | |
#include <windows.h> /* must include this before GL/gl.h */ | |
#include <GL/gl.h> /* OpenGL header file */ | |
#include <GL/glu.h> /* OpenGL utilities header file */ | |
#include <stdio.h> | |
void | |
display() | |
{ | |
/* rotate a triangle around */ | |
glClear(GL_COLOR_BUFFER_BIT); | |
glBegin(GL_TRIANGLES); | |
glColor3f(1.0f, 0.0f, 0.0f); | |
glVertex2i(0, 1); | |
glColor3f(0.0f, 1.0f, 0.0f); | |
glVertex2i(-1, -1); | |
glColor3f(0.0f, 0.0f, 1.0f); | |
glVertex2i(1, -1); | |
glEnd(); | |
glFlush(); | |
} | |
LONG WINAPI | |
WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | |
{ | |
static PAINTSTRUCT ps; | |
switch(uMsg) { | |
case WM_PAINT: | |
display(); | |
BeginPaint(hWnd, &ps); | |
EndPaint(hWnd, &ps); | |
return 0; | |
case WM_SIZE: | |
glViewport(0, 0, LOWORD(lParam), HIWORD(lParam)); | |
PostMessage(hWnd, WM_PAINT, 0, 0); | |
return 0; | |
case WM_CHAR: | |
switch (wParam) { | |
case 27: /* ESC key */ | |
PostQuitMessage(0); | |
break; | |
} | |
return 0; | |
case WM_CLOSE: | |
PostQuitMessage(0); | |
return 0; | |
} | |
return DefWindowProc(hWnd, uMsg, wParam, lParam); | |
} | |
HWND | |
CreateOpenGLWindow(char* title, int x, int y, int width, int height, | |
BYTE type, DWORD flags) | |
{ | |
int pf; | |
HDC hDC; | |
HWND hWnd; | |
WNDCLASS wc; | |
PIXELFORMATDESCRIPTOR pfd; | |
static HINSTANCE hInstance = 0; | |
/* only register the window class once - use hInstance as a flag. */ | |
if (!hInstance) { | |
hInstance = GetModuleHandle(NULL); | |
wc.style = CS_OWNDC; | |
wc.lpfnWndProc = (WNDPROC)WindowProc; | |
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 = "OpenGL"; | |
if (!RegisterClass(&wc)) { | |
MessageBox(NULL, "RegisterClass() failed: " | |
"Cannot register window class.", "Error", MB_OK); | |
return NULL; | |
} | |
} | |
hWnd = CreateWindow("OpenGL", title, WS_OVERLAPPEDWINDOW | | |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN, | |
x, y, width, height, NULL, NULL, hInstance, NULL); | |
if (hWnd == NULL) { | |
MessageBox(NULL, "CreateWindow() failed: Cannot create a window.", | |
"Error", MB_OK); | |
return NULL; | |
} | |
hDC = GetDC(hWnd); | |
/* there is no guarantee that the contents of the stack that become | |
the pfd are zeroed, therefore _make sure_ to clear these bits. */ | |
memset(&pfd, 0, sizeof(pfd)); | |
pfd.nSize = sizeof(pfd); | |
pfd.nVersion = 1; | |
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | flags; | |
pfd.iPixelType = type; | |
pfd.cColorBits = 32; | |
pf = ChoosePixelFormat(hDC, &pfd); | |
if (pf == 0) { | |
MessageBox(NULL, "ChoosePixelFormat() failed: " | |
"Cannot find a suitable pixel format.", "Error", MB_OK); | |
return 0; | |
} | |
if (SetPixelFormat(hDC, pf, &pfd) == FALSE) { | |
MessageBox(NULL, "SetPixelFormat() failed: " | |
"Cannot set format specified.", "Error", MB_OK); | |
return 0; | |
} | |
DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd); | |
ReleaseDC(hWnd, hDC); | |
return hWnd; | |
} | |
int APIENTRY | |
WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, | |
LPSTR lpszCmdLine, int nCmdShow) | |
{ | |
HDC hDC; /* device context */ | |
HGLRC hRC; /* opengl context */ | |
HWND hWnd; /* window */ | |
MSG msg; /* message */ | |
hWnd = CreateOpenGLWindow("minimal", 0, 0, 256, 256, PFD_TYPE_RGBA, 0); | |
if (hWnd == NULL) | |
exit(1); | |
hDC = GetDC(hWnd); | |
hRC = wglCreateContext(hDC); | |
wglMakeCurrent(hDC, hRC); | |
ShowWindow(hWnd, nCmdShow); | |
while(GetMessage(&msg, hWnd, 0, 0)) { | |
TranslateMessage(&msg); | |
DispatchMessage(&msg); | |
} | |
wglMakeCurrent(NULL, NULL); | |
ReleaseDC(hWnd, hDC); | |
wglDeleteContext(hRC); | |
DestroyWindow(hWnd); | |
return msg.wParam; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://gist.github.com/XProger/0e87eeb135d3c7f40e43 ;)