您的位置:首页 > 运维架构

win32 opengl example - 01

2013-12-30 10:44 183 查看
http://www.gamedev.net/page/resources/_/technical/opengl/example-of-the-minimal-win32-opengl-program-r540

Notes: This example isn't Double Buffer,

Therefore in WM_PAINT

display();

BeginPaint(hWnd, &ps);

EndPaint(hWnd, &ps);

is ok.

if enable Double Buffer,

followings codes are ok.

HDC hDC; // global

// glFlush();

SwapBuffers(hDC);

BeginPaint(hWnd, &ps);

display();

EndPaint(hWnd, &ps);

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER | flags;

/* 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>

// HDC hDC;

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();

// SwapBuffers(hDC);

}

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: