本文是在VC6.0的环境下,运用MFC实现的OpenGL最基本框架,需要简单了解MFC编程(会在VC6.0里创建MFC单文档应用程序就行),甚至不必了解OpenGL的知识。以下是具体的步骤。

1、创建MFC单文档应用程序
2
、添加lib

  1. Project->Setting->Link 添加"*.lib" opengl32.lib glu32.lib glut32.lib glaux.lib

以上的lib文件需要存在于VC6.0安装好的目录下的lib文件夹底下,例如:

  1. C:\Program Files\Microsoft Visual Studio\VC98\Lib

如果一些lib文件没有,可以去网上搜下,自己下载。

3、在stdafx.h中添加OpenGL头文件

  1. //OpenGL Headers
  2. #include <gl\gl.h> //OpenGL32库的头文件
  3. #include <gl\glu.h> //GLu32库的头文件
  4. #include <gl\glut.h> //OpenGL实用库的头文件
  5. #include <gl\glaux.h> //GLaux库的头文件

以上的头文件需要存在于VC6.0安装好的目录下的Include下的GL文件夹下,例如:

  1. C:\Program Files\Microsoft Visual Studio\VC98\Include\GL

如果一些头文件没有,可以去网上搜下,自己下载。

4、在MainFrame中设置程序标题、风格和窗口大小

  1. cs.style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU |
  2. WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;
  3. cs.lpszName = "OpenGL最基本框架";
  4. //cs.cx = 500;
  5. //cs.cy = 500;

5、设定OpenGL风格

  1. CMyVIew中的PreCreateWindow中添加
  2. cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

在客户区绘制

6、在CMyView中添加公有(public)成员变量

  1. CClientDC *m_pDC; //Device Context 设备上下文
  2. HGLRC m_hRC; //Rendering Context 着色上下文
  3. CRect m_oldRect;
  4. CString m_WindowTitle ; //窗口标题

7、在CMyView中添加保护(protected)成员函数
7.1、设置像素格式,即OpenGL怎样操作像素

  1. BOOL CMyView::SetupPixelFormat()
  2. {
  3. static PIXELFORMATDESCRIPTOR pfd =
  4. {
  5. sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
  6. , // version number
  7. PFD_DRAW_TO_WINDOW | // support window
  8. PFD_SUPPORT_OPENGL | // support OpenGL
  9. PFD_DOUBLEBUFFER, // double buffered
  10. PFD_TYPE_RGBA, // RGBA type
  11. , // 24-bit color depth
  12. , , , , , , // color bits ignored
  13. , // no alpha buffer
  14. , // shift bit ignored
  15. , // no accumulation buffer
  16. , , , , // accum bits ignored
  17. , // 32-bit z-buffer
  18. , // no stencil buffer
  19. , // no auxiliary buffer
  20. PFD_MAIN_PLANE, // main layer
  21. , // reserved
  22. , , // layer masks ignored
  23. };
  24.  
  25. int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
  26. if ( m_nPixelFormat == )
  27. {
  28. MessageBox("ChoosePixelFormat failed.");
  29. return FALSE;
  30. }
  31. if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
  32. {
  33. MessageBox("SetPixelFormat failed.");
  34. return FALSE;
  35. }
  36. return TRUE;
  37. }

7.2、创建着色描述表并当前化着色表

  1. BOOL CMyView::InitOpenGL()
  2. {
  3. //Get a DC for the Client Area
  4. m_pDC = new CClientDC(this);
  5. //Failure to Get DC
  6. if(m_pDC == NULL)
  7. {
  8. MessageBox("Error Obtaining DC");
  9. return FALSE;
  10. }
  11. //Failure to set the pixel format
  12. if(!SetupPixelFormat())
  13. {
  14. return FALSE;
  15. }
  16. //Create Rendering Context
  17. m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());
  18. //Failure to Create Rendering Context
  19. if(m_hRC == )
  20. {
  21. MessageBox("Error Creating RC");
  22. return FALSE;
  23. }
  24.  
  25. //Make the RC Current
  26. if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE)
  27. {
  28. MessageBox("Error making RC Current");
  29. return FALSE;
  30. }
  31. //GetClientRect(&m_oldRect);
  32. // 启用阴影平滑
  33. ::glShadeModel(GL_SMOOTH);
  34.  
  35. //黑色背景
  36. ::glClearColor(0.0f,0.0f,0.0f,0.0f);
  37. //设置深度缓存
  38. ::glClearDepth(1.0f);
  39. //启用深度测试
  40. ::glEnable(GL_DEPTH_TEST);
  41. //所作深度测试的类型
  42. ::glDepthFunc(GL_LEQUAL);
  43. //告诉系统对透视进行修正
  44. ::glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  45.  
  46. return TRUE;
  47. }

7.3 删除着色表,响应WM_DESTROY消息

  1. void CMyView::OnDestroy()
  2. {
  3. CView::OnDestroy();
  4. //Delete the RC
  5. if(m_hRC)
  6. {
  7. //Make the RC non-current
  8. if(::wglMakeCurrent (NULL,NULL) == FALSE)
  9. {
  10. ::MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
  11. }
  12. //Delete the rendering context
  13. if(::wglDeleteContext (m_hRC)==FALSE)
  14. {
  15. ::MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
  16. }
  17. m_hRC = NULL;
  18. }
  19.  
  20. //Delete the DC
  21. if(m_pDC)
  22. {
  23. delete m_pDC;
  24. }
  25. //Set it to NULL
  26. m_pDC = NULL;

8、响应WM_CREATE消息

  1. int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3. if (CView::OnCreate(lpCreateStruct) == -)
  4. return -;
  5.  
  6. GetParentFrame()->GetWindowText(m_WindowTitle);
  7. GetParentFrame()->ModifyStyle(FWS_ADDTOTITLE,);
  8.  
  9. if(!InitOpenGL())
  10. {
  11. ::MessageBox(NULL,"初始化OpenGL失败.","错
  12. 误",MB_OK|MB_ICONEXCLAMATION);
  13. return -;
  14. }
  15. return ;
  16. }

9、响应WM_SIZE消息

  1. void CMyView::OnSize(UINT nType, int cx, int cy)
  2. {
  3. CView::OnSize(nType, cx, cy);
  4.  
  5. // TODO: Add your message handler code here
  6. if ( cx <= || cy <= )
  7. {
  8. return;
  9. }
  10. if((m_oldRect.right > cx) || (m_oldRect.bottom> cy))
  11. {
  12. RedrawWindow();
  13. }
  14. m_oldRect.right = cx;
  15. m_oldRect.bottom = cy;
  16.  
  17. //选择投影矩阵
  18. ::glMatrixMode(GL_PROJECTION);
  19. //重置投影矩阵
  20. ::glLoadIdentity();
  21. //计算窗口的外观比例
  22. ::gluPerspective(, (GLfloat)cx/(GLfloat)cy, 0.1f, 3.0*10e+11f);
  23. //设置模型观察矩阵
  24. ::glMatrixMode(GL_MODELVIEW);
  25. //重置模型观察矩阵
  26. ::glLoadIdentity();
  27. //::glFrustum(-1.0, 1.0, -1.0, 1.0, 0.0, 7.0);
  28. //设置当前的视口
  29. ::glViewport(, , cx, cy);
  30. }

10、绘制

  1. void CMyView::DrawScene()
  2. {
  3. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  4. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  5. glLoadIdentity();
  6. glColor3f(1.0f,0.0f,0.0f);
  7. glTranslatef(-1.5f,0.0f,-6.0f);
  8. glBegin(GL_TRIANGLES);              // 绘制三角形
  9.        glVertex3f( 0.0f, 1.0f, 0.0f);       // 上顶点
  10.        glVertex3f(-1.0f,-1.0f, 0.0f);       // 左下
  11.        glVertex3f( 1.0f,-1.0f, 0.0f);       // 右下
  12.     glEnd(); 
  13. SwapBuffers(wglGetCurrentDC());      
  14. }

此后,各种绘制代码可以放入DrawScene()中,来扩充自己想要的功能。

11、在OnDraw()中调用DrawScene()

原文链接:

VC基于单文档opengl框架

VC基于单文档OpenGL框架的更多相关文章

  1. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  2. 多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

    老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧.确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如.但我一直没有停止过用 ...

  3. 【Windows编程】系列第十一篇:多文档界面框架

    前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...

  4. 转:CEF嵌入到单文档mfc

    1.下载: http://www.magpcss.net/cef_downloads/下载cef binary 1.1364.1123 windows.zip(可能要FQ,百度goagent教程,最好 ...

  5. VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面

    本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...

  6. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  7. VS2010-MFC(利用MFC向导生成单文档应用程序框架)

    一.VC++与MFC 讲VC++免不了要提MFC,MFC全称Microsoft Foundation Classes,也就是微软基础类库.它是VC++的核心,是C++与Windows API的结合,很 ...

  8. 基于MFC的单文档,多文档,对话框应用程序

    从类的角度区分: 基于对话框(3个类): CAboutDlg 程序名App 程序名Dlg 单文档(5个类): CAboutDlg CMainFrame 程序名App 程序名Doc 程序名View 多文 ...

  9. MFC单文档框架分析及执行流程(转)

    原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

随机推荐

  1. Java面向对象-------多态总结

    1.多态:是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现. 2.多态作用: 1. 消除类型之间的耦合关系 ...

  2. 使用Druid网上监控

    0.添加依赖 <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artif ...

  3. How to write a professional email?

    Advantages and Disadvantages of Email communication compared with Face-To-Face communication:   Emai ...

  4. .net解决Xss攻击

    首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...

  5. 设计模式之建造者模式(Buider)(5)

    简介 在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂.在这里我们就将复杂对象当做汽车 ...

  6. Linux常用基本命令(split )

    split命令 作用:切割文件 格式: split [option] [input] [prefix] -l 指定分割后文件的最大行数 ghostwu@dev:~/linux/split$ cat - ...

  7. iframe页面刷新问题

    1.问题:当iframe的页面加载过再关闭之后,如果iframe的src没有发生变化,js不会重新加载,再次打开页面不会刷新: 2.解决方法:关闭页面时清空src,再次打开时即可重新加载最新数据. $ ...

  8. hadoop重启后,hdfs目录权限问题

    今天重启了下Hadoop集群,使用Eclipse调试hdfs api的时候报错: [WARNING] java.lang.NullPointerException at org.conan.kafka ...

  9. 你用过这种奇葩的C#注释吗

    博客园一位微软MVP的文章 http://www.cnblogs.com/asxinyu/p/4383402.html#autoid-0-0-0 摘录: 我这里说的奇葩,并不是脱离三种方式,而是其注释 ...

  10. [Android] 旋转照片/图片

    今天比较闲(是任务做完了,不是偷懒),就多更新几篇,补一下之前做的东西. 原文地址请保留http://www.cnblogs.com/rossoneri/p/3995306.html 推荐阅读: An ...