基于对话框的Opengl框架

版权声明:本文为博主原创文章,未经博主允许不得转载。
这里,我主要是利用opengl在一个picture控件中绘图,绘制的是一个静态图片,如果想实现动画,可以利用ontimer函数实现。编译器为vs2010。
1、首先创建一个基于对话框的MFC程序,我这里命名为MFC_Dlg。
2、配置opengl环境
首先添加链接库,在菜单栏 项目->属性->配置属性->链接器->输入->附加依赖项,添加glut32.lib,glaux.lib。如图:

然后,在stdafx.h里面添加opengl的头文件,如下:
- ////////////opengl头文件/////////////////////
- #include "gl\GLUT.H"
- #include "gl\GLAUX.H"
- #include <stdio.h>
- #include <math.h>
3、为对话框添加一个picture控件,ID为IDC_PIC。
4、添加消息相应函数
这里主要是为了在窗口销毁时释放DC和RC资源,为对话框添加了WM_DESTORY消息的相应函数。
5、在对话框头文件中添加相应的成员函数以及数据成员,如下:
- public:
- HGLRC m_hRC; //着色描述表
- CDC *m_pDC; //设备描述表
- BOOL InitOpengl(); //初始化opengl
- BOOL SetupPixelFormat(); //设置图片控件的像素格式
- void RenderScene(); //绘制图像
6、初始化opengl
在对话框的OnInitDialog()中调用了InitOpengl()对opengl进行初始化
- // TODO: 在此添加额外的初始化代码
- InitOpengl(); //初始化opengl
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
对应的InitOpengl()代码如下:
- BOOL CMFC_DlgDlg::InitOpengl()
- {
- //获取图片控件DC
- m_pDC=new CClientDC(GetDlgItem(IDC_PIC));
- if(m_pDC==NULL)
- return FALSE;
- //设置图片控件像素
- if (!SetupPixelFormat())
- return FALSE;
- //创建兼容RC
- m_hRC=wglCreateContext(m_pDC->GetSafeHdc());
- if (m_hRC==0)
- {
- return FALSE;
- }
- //激活RC
- if (wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC)==FALSE)
- {
- return FALSE;
- }
- //设置投影模式
- GLdouble aspect_ratio;
- GLsizei width,height;
- CRect rect;
- CWnd *pWnd=NULL;
- pWnd=GetDlgItem(IDC_PIC);
- pWnd->GetClientRect(rect);
- width=rect.right-rect.left;
- height=rect.bottom-rect.top;
- glViewport(0,0,width,height);
- aspect_ratio=(GLdouble)width/(GLdouble)height;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0f,aspect_ratio,0.1,200.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glClearColor(0.0f,0.0f,0.0f,0.0f);
- glClearDepth(1.0f);
- glEnable(GL_DEPTH_TEST);
- return TRUE;
- }
7、在上述函数中调用了像素初始化函数SetupPixelFormat()对picture控件的像素进行初始化,其代码如下:
- BOOL CMFC_DlgDlg::SetupPixelFormat()
- {
- static PIXELFORMATDESCRIPTOR pfd=
- {
- sizeof(PIXELFORMATDESCRIPTOR),
- 1,
- PFD_DRAW_TO_WINDOW|
- PFD_SUPPORT_OPENGL|
- PFD_DOUBLEBUFFER,
- PFD_TYPE_RGBA,
- 24,
- 0,0,0,0,0,0,
- 0,
- 0,
- 0,
- 0,0,0,0,
- 16,
- 0,
- 0,
- PFD_MAIN_PLANE,
- 0,
- 0,0,0
- };
- int m_nPixelFormat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);//在窗口找查找该像素格式
- if (m_nPixelFormat==0)
- {
- return FALSE;
- }
- if (SetPixelFormat(m_pDC->GetSafeHdc(),m_nPixelFormat,&pfd)==FALSE)//设置picture控件的像素格式
- {
- return FALSE;
- }
- return TRUE;
- }
8、通过上面两步,就完成了初始化,下面开始绘图。为了保证图形在重绘时仍然存在,在对话框的OnPaint()函数中通过调用RenderScene()实现绘图操作,将代码添加到else块中
- else
- {
- RenderScene(); //向缓冲区绘图
- SwapBuffers(m_pDC->GetSafeHdc()); //交换缓冲区
- CDialogEx::OnPaint();
- }
其中,RenderScene()代码如下:
- void CMFC_DlgDlg::RenderScene()
- {
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0f,0.0f,-5.0f);
- glBegin(GL_TRIANGLES);
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f(0.0f,1.0f,1.0f);
- glColor3f(0.0f,1.0f,0.0f);
- glVertex3f(-1.5f,-1.0f,0.0f);
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f(1.5f,-1.0f,0.0f);
- glEnd();
- }
这里为了简单,只画了一个三角形。
9、释放资源
在写程序,如果忘记释放DC和RC,将会导致内存泄露,随着程序运行次数的增多,内存占有量越来越大。这里在WM_DESTORY的消息响应函数中释放资源,
- void CMFC_DlgDlg::OnDestroy()
- {
- CDialogEx::OnDestroy();
- // TODO: 在此处添加消息处理程序代码
- if (wglMakeCurrent(NULL,NULL)==FALSE) //释放RC
- {
- MessageBox("无法释放RC");
- }
- if (wglDeleteContext(m_hRC)==FALSE) //删除RC
- {
- MessageBox("无法删除RC");
- }
- if (m_pDC)
- {
- delete m_pDC;
- }
- m_pDC=NULL;
- }
运行效果如下:

到此,整个框架就建立起来了,其他的绘图操作都可以在RenderScene()中实现。如果想实现动画效果,只需要设置一个定时器,并在WM_TIMER消息响应函数中改变图形位置并调用RenderScene()即可,并且在OnDestroy中killtimer。
我也是初学者,有什么不对,大家请指正!
基于对话框的Opengl框架的更多相关文章
- VC基于单文档OpenGL框架
本文是在VC6.0的环境下,运用MFC实现的OpenGL最基本框架,需要简单了解MFC编程(会在VC6.0里创建MFC单文档应用程序就行),甚至不必了解OpenGL的知识.以下是具体的步骤. 1.创建 ...
- 1、基于MFC的OpenGL程序
首先,使用的库是GLUT以及GLAUX,先下载两者,添加查找路径以及链接 一.单文本文件 工程openGLMFC 1.创建单文本文件 2.添加路径.链接 方法如之前篇章所示, 链接库为op ...
- 【游戏开发】基于VS2017的OpenGL开发环境搭建
一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...
- 基于MFC的OpenGL程序<转>
原贴地址:https://www.cnblogs.com/pinking/p/6180225.html 首先,使用的库是GLUT以及GLAUX,先下载两者,添加查找路径以及链接 一.单文本文件 ...
- VS2013 MFC基于对话框编程
前言一直利用Qt库做Ui设计,但针对于一些MFC项目,掌握一些必要的MFC开发技巧还是很有必要的.这篇博客里就将自己所学的一些MFC浅显知识记录一下,方便今后的学习.博客里只记录关键步骤. 一.新建M ...
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...
- VS中基于对话框的MFC利用换肤改变边框颜色及格式
第一版本: http://ishare.iask.sina.com.cn/f/13836420.html?from=like 2. http://www.cnblogs.com/phinecos/ar ...
- 基于LoadRunner构建接口测试框架
基于LoadRunner构建接口测试框架 http://www.docin.com/p-775544153.html
- 基于对话框的MFC应用程序基本结构
新建一个基于对话框的MFC应用程序,假设命名为 Test:则该应用程序在刚创建的时候,有4个非常重要的文件和3个类: 4个非常重要的文件 1.Test.h 2.Test.cpp (应用程序类头文件) ...
随机推荐
- 先行发生原则(Happens-before)
先行发生原则(Happens-Before)是判断数据是否存在竞争.线程是否安全的主要依据. 先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影 ...
- UVA1406 - A Sequence of Numbers(树状数组)
UVA1406 - A Sequence of Numbers(树状数组) 题目链接 题目大意: 给定N个数字.给两种操作:C x: 把这N个数字都加上x. Q x:查询这N个数里面有多少个数字和2^ ...
- 我是如何通过一个 XSS 探测搜狐内网扫描内网并且蠕动前台到最后被发现的
我是如何通过一个 XSS 探测搜狐内网扫描内网并且蠕动前台到最后被发现的!(附带各种 POC) | WooYun-2014-76685 | WooYun.orghttp://wooyun.org/bu ...
- Vue 响应式属性
本文参考自:https://www.w3cplus.com/vue/vue-reactivity-and-pitfalls.html 1.概述 当创建一个Vue实例时,每个数据属性.组件属性等都是可以 ...
- (六)jQuery选择器
jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一 ...
- easyui datagrid自己定义操作列
通过formatter方法给Jquery easyui 的datagrid 每行添加操作链接 我们都知道Jquery的EasyUI的datagrid能够加入而且自己定义Toolbar. 这样我们选择一 ...
- 显存不够----ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[4096]
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[4096] 类似问题 h ...
- EventListener中的handleEvent
在研究代码时发现类似这样一段代码: function TEST() {} TEST.prototype = { init:function() { window.addEventListener('m ...
- CPU调度算法
批处理系统中的调度算法: *需要考虑的因素: 1. 吞吐量 2. cpu利用率 3. 周转时间 4. 公平性* 1.先来先服务: FCFS: 优点:实现简单 缺点:可能造成周转时间长 2.最短作业优先 ...
- 启动Eclipse时,启不起来JVM terminated. Exit code=-1
启动Eclipse时,启不起来JVM terminated. Exit code=-1 出现错误了,不知道什么原因原本好好的Eclipse,今天早上出问题了,启动不起来还抛出JVM terminate ...