在Win32下搭建opengl绘制环境

来源:互联网 发布:千里江山图 知乎 编辑:程序博客网 时间:2024/05/18 03:03

在官方标准教程中使用glfw3来创建opengl的窗体,处理输入相关消息。本文介绍下如何在win32下搭建opengl绘制环境。

以下是在win32下搭建opengl绘制环境的流程

1.入口函数:int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)

2.窗口处理函数:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

3.注册窗口类型:WNDCLASS  注册函数RegisterClass

4.创建窗口:CreateWindow

5.获取DC:GetDC( hWnd );

6.初始化PIXELFORMATDESCRIPTOR

7.设置像素结构:SetPixelFormat

8.创建RC:wglCreateContext

9.设置opengl渲染环境:wglMakeCurrent

10.善后处理:wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC );ReleaseDC( hWnd, hDC );

11:主循环:PeekMessage处理相关消息,其他时候进行opengl绘制。

以下代码源自opengl.org提供的链接

//// GLSAMPLE.CPP//  by Blaine Hodge//// Includes#include <windows.h>#include <gl/gl.h>// Function DeclarationsLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);// WinMainint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,    LPSTR lpCmdLine, int iCmdShow){WNDCLASS wc;HWND hWnd;HDC hDC;HGLRC hRC;MSG msg;BOOL quit = FALSE;float theta = 0.0f;// register window classwc.style = CS_OWNDC;wc.lpfnWndProc = WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );wc.hCursor = LoadCursor( NULL, IDC_ARROW );wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );wc.lpszMenuName = NULL;wc.lpszClassName = "GLSample";RegisterClass( &wc );// create main windowhWnd = CreateWindow( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,0, 0, 256, 256,NULL, NULL, hInstance, NULL );// enable OpenGL for the windowEnableOpenGL( hWnd, &hDC, &hRC );// program main loopwhile ( !quit ){// check for messagesif ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )  ){// handle or dispatch messagesif ( msg.message == WM_QUIT ) {quit = TRUE;} else {TranslateMessage( &msg );DispatchMessage( &msg );}} else {// OpenGL animation code goes hereglClearColor( 0.0f, 0.0f, 0.0f, 0.0f );glClear( GL_COLOR_BUFFER_BIT );glPushMatrix();glRotatef( theta, 0.0f, 0.0f, 1.0f );glBegin( GL_TRIANGLES );glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );glEnd();glPopMatrix();SwapBuffers( hDC );theta += 1.0f;}}// shutdown OpenGLDisableOpenGL( hWnd, hDC, hRC );// destroy the window explicitlyDestroyWindow( hWnd );return msg.wParam;}// Window ProcedureLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_CREATE:return 0;case WM_CLOSE:PostQuitMessage( 0 );return 0;case WM_DESTROY:return 0;case WM_KEYDOWN:switch ( wParam ){case VK_ESCAPE:PostQuitMessage(0);return 0;}return 0;default:return DefWindowProc( hWnd, message, wParam, lParam );}}// Enable OpenGLvoid EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC){PIXELFORMATDESCRIPTOR pfd;int format;// get the device context (DC)*hDC = GetDC( hWnd );// set the pixel format for the DCZeroMemory( &pfd, sizeof( pfd ) );pfd.nSize = sizeof( pfd );pfd.nVersion = 1;pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;pfd.iPixelType = PFD_TYPE_RGBA;pfd.cColorBits = 24;pfd.cDepthBits = 16;pfd.iLayerType = PFD_MAIN_PLANE;format = ChoosePixelFormat( *hDC, &pfd );SetPixelFormat( *hDC, format, &pfd );// create and enable the render context (RC)*hRC = wglCreateContext( *hDC );wglMakeCurrent( *hDC, *hRC );}// Disable OpenGLvoid DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC){wglMakeCurrent( NULL, NULL );wglDeleteContext( hRC );ReleaseDC( hWnd, hDC );}


0 0
原创粉丝点击