#include <gl/opengl.h>HGLRC       hRc = NULL;             // opengl 着色描述表
HDC         hDc = NULL;             // Windows 设备描述表
/*opengl 中将着色描述表与设备描述相与联接,设备描述表与GDI相互联接,从而绘图。总体顺序:hRc -> hDc -> GDI
*/
HWND        hWnd = NULL;
HINSTANCE   hInstance = NULL;
BOOL keys[256];
BOOL active = TRUE;                 // 当激活状态为假是时,暂停程序操做
BOOL fullscreen = TRUE;LRESULT CALLBACK WindowProc( HWND, UINT, WPARAM, LPARAM);GLvoid ReSizeGLScene(GLsizei width, GLsizei height){if (height == 0) height = 1;glViewport(0,0,width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();// 设置视口大小gluPerspective(45.0f, (GLfloat)width/(GLfloat)height,0.1f, 100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}int InitGL(GLvoid){glShadeModel(GL_SMOOTH);glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 开启深度测试类型glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);return TRUE;
}BOOL DrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();return TRUE;
}GLvoid KillGLWindow(GLvoid){if (fullscreen){ChangeDisplaySettings(NULL, 0);ShowCursor(TRUE);}if (hRc){// 个人感觉此函数为 HRC 与HDC 建产相互联系的函数if (!wglMakeCurrent(NULL, NULL)){MessageBox(NULL, "释放DC或RC失败。","关闭错误",MB_OK|MB_CANCELTRYCONTINUE);}if (!wglDeleteContext(hRc)){MessageBox(NULL, "释放RC失败。","关闭错误",MB_OK|MB_CANCELTRYCONTINUE);}hRc = NULL;}if (hDc && !ReleaseDC(hWnd, hDc)){MessageBox(NULL, "释放DC失败。","关闭错误",MB_OK|MB_CANCELTRYCONTINUE);hDc = NULL;}if (hWnd && !DestroyWindow(hWnd)){MessageBox(NULL, "释放窗口句柄失败。","关闭错误",MB_OK|MB_CANCELTRYCONTINUE);hWnd = NULL;}if (!UnregisterClass("opengl", hInstance)){MessageBox(NULL, "不能注销窗口类。","关闭错误",MB_OK|MB_CANCELTRYCONTINUE);hInstance = NULL;}
}BOOL CreateGLWindow(char* title, int width, int height, int bits, BOOL fullscreenflag){GLuint PixelFormat;         // 保存查找匹配的结果WNDCLASS wc;DWORD dwExStyle;            // 扩展窗口风格DWORD dwStyle;              // 窗口风格// windows 的窗口RECT WindowRect;WindowRect.left = static_cast<long>(0);WindowRect.right = static_cast<long>(width);WindowRect.top = static_cast<long>(0);WindowRect.bottom = static_cast<long>(height);// 全屏标志fullscreen = fullscreenflag;// 窗口类的定义hInstance       = GetModuleHandle(NULL);wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;wc.lpfnWndProc      = 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, "注册窗口失败", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}// 全屏模式判断,操做if (fullscreen){DEVMODE dmScreenSetting;memset(&dmScreenSetting, 0, sizeof(dmScreenSetting));dmScreenSetting.dmSize          = sizeof(dmScreenSetting);dmScreenSetting.dmPelsHeight    = height;dmScreenSetting.dmPelsWidth     = width;dmScreenSetting.dmBitsPerPel    = bits;dmScreenSetting.dmFields        = DM_BITSPERPEL|DM_PELSHEIGHT|DM_PELSWIDTH;// 设置显示模式if (ChangeDisplaySettings(&dmScreenSetting, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL){if (MessageBox(NULL, "全屏模式在当前显卡上设置失败!\n使用窗口模式?","NeHe G",MB_YESNO|MB_ICONEXCLAMATION) == IDYES){fullscreen = FALSE;}else{MessageBox(NULL, "程序将被关闭", "错误", MB_OK|MB_ICONSTOP);return FALSE;}}}// 出错后进行的相应操作if (fullscreen){// WS_EX_APPWINDOW // Forces a top-level window onto the taskbar when the window is visible.dwExStyle = WS_EX_APPWINDOW;dwStyle = WS_POPUP;ShowCursor(FALSE);}else{dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;dwStyle = WS_OVERLAPPEDWINDOW;}AdjustWindowRectEx(&WindowRect,dwStyle,FALSE, dwExStyle);if (! (hWnd = CreateWindowEx(dwExStyle, "opengl", title,WS_CLIPSIBLINGS|WS_CLIPCHILDREN|dwStyle, 0, 0,WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top, NULL, NULL, hInstance,NULL))){KillGLWindow();MessageBox(NULL, "不能创建一个窗口设备描述表", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}static PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW |                // 支持窗口PFD_SUPPORT_OPENGL|                 // 支持 openglPFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0, 0, 0, 0, 0, 0,               // 忽略的色彩位0,                              // 无Alpha缓存0,                              // 忽略Shift Bit0,                              // 无累加缓存0, 0, 0, 0,                         // 忽略聚集位16,                             // 16位 Z-缓存 (深度缓存)0,                              // 无蒙板缓存0,                              // 无辅助缓存PFD_MAIN_PLANE,                         // 主绘图层0,                              // Reserved0, 0, 0                             // 忽略层遮罩};if (!(hDc = GetDC(hWnd))){KillGLWindow();MessageBox(NULL, "不能创建一种相匹配的像素格式", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}if (!(PixelFormat = ChoosePixelFormat(hDc, &pfd))){KillGLWindow();MessageBox(hWnd, "不能设置像素格式", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}if (!SetPixelFormat(hDc, PixelFormat, &pfd)){KillGLWindow();MessageBox(hWnd, "不能设置像素格式", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}if (!(hRc = wglCreateContext(hDc))){KillGLWindow();MessageBox(NULL, "不能创建openGL渲染描述表","错误",MB_OK|MB_ICONEXCLAMATION);return FALSE;}if (!(wglMakeCurrent(hDc, hRc))){KillGLWindow();MessageBox(NULL, "不能激活当前的openGL渲染描述表", "错误", MB_OK|MB_ICONEXCLAMATION);return FALSE;}ShowWindow(hWnd, SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ReSizeGLScene(width, height);if (!InitGL()){KillGLWindow();MessageBox(NULL, "Initialization Failed.","error",MB_OK|MB_ICONEXCLAMATION );return FALSE;}return TRUE;
}LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch(uMsg){case WM_ACTIVATE: {if (!HIWORD(wParam))active = TRUE;elseactive = FALSE;return 0;}case WM_SYSCOMMAND:{switch(wParam){case SC_SCREENSAVE:// 屏保运行代码case SC_MONITORPOWER:// 进入节电模式运行代码return 0;}break;}case WM_CLOSE:{PostQuitMessage(0);return 0;}case WM_KEYUP:{keys[wParam] = TRUE;return 0;}case WM_KEYDOWN:{keys[wParam] = FALSE;return 0;}case WM_SIZE:{ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));return 0;}}return DefWindowProc(hWnd, uMsg, wParam, lParam);
}int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){MSG msg;BOOL done=FALSE;// 提示用户选择运行模式if (MessageBox(NULL, "你想在全屏模式下运行吗?", "设置全屏模式", MB_YESNO|MB_ICONEXCLAMATION) == IDNO)fullscreen = FALSE;if (!CreateGLWindow("Nehe's openGL 程序框架", 640, 480, 16, fullscreen))return 0;while (!done){if (PeekMessage(&msg, NULL, 0,0,PM_REMOVE)){if (msg.message == WM_QUIT){done = TRUE;}else{TranslateMessage(&msg);DispatchMessage(&msg);}}else{                               // 当没有消息时,进行的操做if (active){if (keys[VK_ESCAPE]){done = TRUE;}else{DrawGLScene();SwapBuffers(hDc);               }if (keys[VK_F1]){keys[VK_F1] =FALSE;KillGLWindow();fullscreen = !fullscreen;// 重建opengl窗口if (!CreateGLWindow("Nehe's openGL 程序框架", 640, 480, 16, fullscreen))return 0;}}} // end if } //end while KillGLWindow();return (msg.wParam);
}// end WinMain

Lesson 1 Nehe相关推荐

  1. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02

    http://jimmyzhouj.blog.51cto.com/2317513/883520 原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 .作者信息和本声明.否则将追究法律责任 ...

  3. NeHe OpenGL第四十一课:体积雾气

    NeHe OpenGL第四十一课:体积雾气 体积雾气 把雾坐标绑定到顶点,你可以在雾中漫游,体验一下吧.   这一课我们将介绍体积雾,为了运行这个程序,你的显卡必须支持扩展"GL_EXT_f ...

  4. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  5. NeHe OpenGL第三十三课:TGA文件

    NeHe OpenGL第三十三课:TGA文件 加载压缩和未压缩的TGA文件: 在这一课里,你将学会如何加载压缩和为压缩的TGA文件,由于它使用RLE压缩,所以非常的简单,你能很快地熟悉它的.   我见 ...

  6. NeHe OpenGL第三十九课:物理模拟

    NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切.   物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...

  7. NeHe OpenGL第二十八课:贝塞尔曲面

    NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( ogapo@ithink. ...

  8. NeHe OpenGL第十课:3D世界

    NeHe OpenGL第十课:3D世界 加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由 ...

  9. NeHe OpenGL教程 第四十课:绳子的模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

最新文章

  1. PHP实现将任意尺寸的图片裁剪后等比缩放到任意尺寸的透明图片上,并实现图片翻转...
  2. ABAP DOI详解(2)
  3. 从集合中选出一些元素组成子集合,使得这些子集合符合某种约束
  4. 苹果CMSV10绿色毛毛虫主题模板
  5. python-函数的定义与调用
  6. ssms中怎么设置自增_如何在SSMS状态栏中设置自定义颜色
  7. angular post php 404,AngularJS POST失败:飞行前响应具有无效的HTTP状态代码404
  8. Metaweblog在Android上使用
  9. 微信小程序系列(5)如何用微信小程序写一个论坛?贴心代码详解(三)列表页
  10. linux windows凤凰,凤凰系统率先升级内核到Linux4.9,支持更多新硬件
  11. 树莓派3B+ WiFi 无线连接及配置
  12. bzoj3039 玉蟾宫
  13. NFT数字艺术品热潮下,IPFS或成为其最佳的存储解决方案
  14. Java课程设计报告--绩效考核信息管理系统
  15. python华表_鹤归华表 丁令威化鹤
  16. 如何解决win10语言栏消失变成空白问题
  17. 第三方支付为什么会兴起
  18. 在天堂与地狱之间——清华浪子梦断中关村 (转)
  19. react-native 实现渐变色背景
  20. 详解c语言main函数、printf函数、scanf函数与va家族

热门文章

  1. IOS网络开发(一)
  2. 分享 8 个有趣且实用的 API
  3. java mock私有方法_java单元测试使用jMockit mock私有方法
  4. AWS 亚马逊和Aliyun阿里云的区别比较和深度分析
  5. 一、UML类图图式样例
  6. Python密码学入门:凯撒密码
  7. 苹果手机话筒声音小怎么办_手机声音小怎么办?7个办法教您轻松解决
  8. kvm虚拟化常用命令
  9. Python_PyQuery模块打开本地文件报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 84
  10. ORACLE数据库超出游标异常解决(maximum open cursors exceeded)