Opengl and Win32
2010-03-20 21:40
316 查看
1.create a wndclass
2.regist your wndclass and return a HWND
3.get a HDC from the HWND
4.set the pixelformat uesd by the HDC
5.get a HGLRC from the HDC
6.wglMakeCurrent(*HDC,*HGLRC)
opengl api use the HGLRC to communicate with the windows
MyHeader.h
GetHWND.c
En_DisOpengl.c
WndProc.c
Main.c
2.regist your wndclass and return a HWND
3.get a HDC from the HWND
4.set the pixelformat uesd by the HDC
5.get a HGLRC from the HDC
6.wglMakeCurrent(*HDC,*HGLRC)
opengl api use the HGLRC to communicate with the windows
MyHeader.h
#include <Windows.h> #include <gl/GL.h> // Function Declarations HWND GetHWND(HINSTANCE); LRESULT 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);
GetHWND.c
#include "MyHeader.h" HWND GetHWND(HINSTANCE hInstance) { WNDCLASS wc; wc.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(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("GLSample"); if (!RegisterClass(&wc)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),TEXT("ERROR"),MB_ICONERROR); return 0; } // create main window return (CreateWindow( TEXT("GLSample"),TEXT("OpenGL Sample"), WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 512, 512, NULL, NULL, hInstance, NULL )); }
En_DisOpengl.c
#include "MyHeader.h" void 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 DC ZeroMemory( &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 OpenGL void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); }
WndProc.c
#include "MyHeader.h" LRESULT 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; default: return DefWindowProc( hWnd, message, wParam, lParam ); } }
Main.c
#include "MyHeader.h" // WinMain int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; hWnd=GetHWND(hInstance); // enable OpenGL for the window EnableOpenGL( hWnd, &hDC, &hRC ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); SwapBuffers( hDC ); // program main loop while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // shutdown OpenGL DisableOpenGL( hWnd, hDC, hRC ); // destroy the window explicitly DestroyWindow( hWnd ); return msg.wParam; }
相关文章推荐
- OpenGL学习脚印:光源类型和使用多个光源(Light source and multiple lights)
- win32 opengl example - 04 (MFC)
- 用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口
- OpenGL ES multithreading and EAGLSharegroup
- opengl and uikit
- WIN32_LEAN_AND_MEAN宏
- Win32 Tips and Tricks
- DirectX OpenGL and WPF
- Android Graphic : apk and Skia/OpenGL|ES
- 一个大牛的系列文章:An intro to modern OpenGL. Chapter 3: 3D transformation and projection
- OpenGL(Win32控制台应用程序框架)
- OPENGL|ES第四天,Adding color and shade
- 在Win32下使用OpenGL
- gluPerspective and gluLookAt 在OpenGL-ES中的替代
- Windows下OpenGL轻松加载BMP, GIF, JPEG, PNG, and TIFF图片
- 【译】TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 (下)
- OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)
- OpenGL3D图形、旋转、纹理、键盘移动、光照、滤波、透明(完整) 转自http://www.cnblogs.com/tiandsp/archive/2012/01/23/2329049.html
- WIN32 opengl绘制一个点
- [转]#define WIN32_LEAN_AND_MEAN 的作用