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

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

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

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

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

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

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

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

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

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

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

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

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

5、设定OpenGL风格

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

在客户区绘制

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

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

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

BOOL CMyView::SetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
, // 24-bit color depth
, , , , , , // color bits ignored
, // no alpha buffer
, // shift bit ignored
, // no accumulation buffer
, , , , // accum bits ignored
, // 32-bit z-buffer
, // no stencil buffer
, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
, // reserved
, , // layer masks ignored
}; int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
if ( m_nPixelFormat == )
{
MessageBox("ChoosePixelFormat failed.");
return FALSE;
}
if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed.");
return FALSE;
}
return TRUE;
}

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

BOOL CMyView::InitOpenGL()
{
//Get a DC for the Client Area
m_pDC = new CClientDC(this);
//Failure to Get DC
if(m_pDC == NULL)
{
MessageBox("Error Obtaining DC");
return FALSE;
}
//Failure to set the pixel format
if(!SetupPixelFormat())
{
return FALSE;
}
//Create Rendering Context
m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());
//Failure to Create Rendering Context
if(m_hRC == )
{
MessageBox("Error Creating RC");
return FALSE;
} //Make the RC Current
if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE)
{
MessageBox("Error making RC Current");
return FALSE;
}
//GetClientRect(&m_oldRect);
// 启用阴影平滑
::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;
}

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

void CMyView::OnDestroy()
{
CView::OnDestroy();
//Delete the RC
if(m_hRC)
{
//Make the RC non-current
if(::wglMakeCurrent (NULL,NULL) == FALSE)
{
::MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
//Delete the rendering context
if(::wglDeleteContext (m_hRC)==FALSE)
{
::MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
m_hRC = NULL;
} //Delete the DC
if(m_pDC)
{
delete m_pDC;
}
//Set it to NULL
m_pDC = NULL;

8、响应WM_CREATE消息

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -)
return -; GetParentFrame()->GetWindowText(m_WindowTitle);
GetParentFrame()->ModifyStyle(FWS_ADDTOTITLE,); if(!InitOpenGL())
{
::MessageBox(NULL,"初始化OpenGL失败.","错
误",MB_OK|MB_ICONEXCLAMATION);
return -;
}
return ;
}

9、响应WM_SIZE消息

void CMyView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here
if ( cx <= || cy <= )
{
return;
}
if((m_oldRect.right > cx) || (m_oldRect.bottom> cy))
{
RedrawWindow();
}
m_oldRect.right = cx;
m_oldRect.bottom = cy; //选择投影矩阵
::glMatrixMode(GL_PROJECTION);
//重置投影矩阵
::glLoadIdentity();
//计算窗口的外观比例
::gluPerspective(, (GLfloat)cx/(GLfloat)cy, 0.1f, 3.0*10e+11f);
//设置模型观察矩阵
::glMatrixMode(GL_MODELVIEW);
//重置模型观察矩阵
::glLoadIdentity();
//::glFrustum(-1.0, 1.0, -1.0, 1.0, 0.0, 7.0);
//设置当前的视口
::glViewport(, , cx, cy);
}

10、绘制

void CMyView::DrawScene()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f(1.0f,0.0f,0.0f);
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);              // 绘制三角形
       glVertex3f( 0.0f, 1.0f, 0.0f);       // 上顶点
       glVertex3f(-1.0f,-1.0f, 0.0f);       // 左下
       glVertex3f( 1.0f,-1.0f, 0.0f);       // 右下
    glEnd(); 
SwapBuffers(wglGetCurrentDC());      
}

此后,各种绘制代码可以放入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. 撩课-Web大前端每天5道面试题-Day29

    1.https协议的优点? 使用HTTPS协议可认证用户和服务器, 确保数据发送到正确的客户机和服务器: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输. 身份认证的网络协议,要比http ...

  2. 关于项目管理工具 maven

    众所周知,maven是目前很常用的项目管理工具.一般情况下,通过在pom.xml添加相应内容,再maven-->update就会自动把相应的jar包下载.配置好,非常方便. 一般每新建一个wor ...

  3. AutoFac实现WebAPI依赖注入(EF以及Mysql)

    什么是依赖注入? 我们以实际的例子来加以介绍 实体如下 public class Product { public int ID { get; set; } public string Name { ...

  4. 一些减少代码量、提高开发效率的利器(Java)

    Spring Boot mybatis-plus代码生成器和自带CRUD接口 lombok 库: Apache Commons & guava AOP Java8: stream & ...

  5. 网页CSS中*{margin:0; padding:0;}有什么用

    * 这东西叫“通配符”用来匹配页面上所有元素.*{margin:0; padding:0;} 像 2L 所说,body ,ul, li ,p,h1~h6,dd,dt 等……都有默认的margin 或p ...

  6. CentOS7添加入windows2008的AD域

    采用域控对用户权限进行限制的时候,经常会出现需要将linux加入windows域,毕竟windows的AD域超级强大.用户名可以由windows进行统一管理,方便办公使用.下面简单介绍如何进行配置. ...

  7. 浅析ARM公司在物联网领域的战略布局

    From: http://www.cnblogs.com/yefanqiu/p/3447769.html 浅析ARM公司在物联网领域的战略布局 随着ARM芯片的出货量越来越多,自信满满的ARM公司统一 ...

  8. mybatis-generator 详细配置及使用,爬坑记录

    mybatis-generator 详细配置及使用,爬坑记录 提示:如果不成功一定是项目路径和 数据库配置出问题,本篇基于 MySQL 8.0.13,调试没有问题. 如果失败,建议使用相同的项目结构, ...

  9. 数据库小组第N次小组会议

    时间:5.30晚,9:30 ~ 11:30 主题:讨论android app与服务器之间数据同步的技术选型与实现 与会人:陈兆庭,黄志鹏,吴雪晴 讨论内容: 大体分析 关于数据同步,整体上有两部分,用 ...

  10. 容器监控—阿里云&容器内部服务监控

    目前Docker的使用越来越离不开对容器的监控,阿里云最近上线了容器服务,不但提供了核心的容器和宿主机监控能力,而且支持集成 Cloud Insight 监控,下面会介绍如何集成. 首先介绍一下阿里云 ...