OpenGL+MFC编程入门(VS2013)
来源:互联网 发布:淘宝旗舰店加盟 编辑:程序博客网 时间:2024/05/18 15:28
学OpenGL的时候老师总是说MFC的程序,一直觉得不好弄就先没学,这次在实验中出现了,不得不慢慢百度着学习了。感觉刚开始无从下手,所以这这里记录下来过程,也方便看的人少走弯路吧。
一、创建MFC项目。
照着图片选择完毕后,点击完成。
创建好的结果是这样的:
二、导入OpenGL头文件以及lib文件。
首先在stdafx.h中添加OpenGL的头文件:
然后导入lib文件:
右键解决方案打开解决方案的属性,然后按图中选择:
然后添加lib文件:
然后添加bSetDCPixelFormat函数:
注意修改的几个地方:
然后添加下面的代码:
// 为一个特定的设备环境选择像素格式 bool COpenGL_MFCView::bSetDCPixelFormat(void) { // 设置像素格式 static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // 结构的大小 1, // 结构的版本 PFD_DRAW_TO_WINDOW | // 在窗口(而不是位图)中绘图 PFD_SUPPORT_OPENGL | // 支持在窗口中进行OpenGL调用 PFD_DOUBLEBUFFER, // 双缓冲模式 PFD_TYPE_RGBA, // RGBA颜色模式 32, // 需要32位颜色 0, 0, 0, 0, 0, 0, // 不用于选择模式 0, 0, // 不用于选择模式 0, 0, 0, 0, 0, // 不用于选择模式 16, // 深度缓冲区的大小 0, // 在此不使用 0, // 在此不使用 0, // 在此不使用 0, // 在此不使用 0, 0, 0 // 在此不使用 }; // 选择一种与pfd所描述的最匹配的像素格式 int nPixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd); if(0 == nPixelFormat) return false; // 为设备环境设置像素格式 return SetPixelFormat(m_pDC->GetSafeHdc(), nPixelFormat, &pfd); }
三、添加相应的几个函数(事件函数):OnCreate(窗口创建时调用),Ondestroy(窗口关闭调用),OnInitialUpdate(窗口被创建后运行一次的函数),OnSize(窗口改变时调用)等等一系列函数。
重复上面的过程,添加剩下两个函数。
结果如下:
然后添加OnInitialUpdate(类似于OpenGL中的OnInit()函数):
如图打开类向导:
添加代码:(这里添加的初始化代码根据自己的需要写)
void CMFCTestView::OnInitialUpdate(){ CView::OnInitialUpdate(); // TODO: 在此添加专用代码和/或调用基类 glClearColor(1, 1, 1, 0); glShadeModel(GL_FLAT);}
添加OpenGL所需要的其他部分代码:
①首先为MFCTestView类添加m_hRC、m_pDC成员变量:
private: HGLRC m_hRC; CClientDC* m_pDC;
②接着修改相应的事件响应函数,主要涉及三个函数OnCreate(),OnSize(),OnDestroy(),代码如下(照抄就行):
int CMFCTestView::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 // 创建DC m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL); // 选择像素格式 if (!bSetDCPixelFormat()) return -1; // 创建渲染环境, 并使它成为当前渲染环境 m_hRC = wglCreateContext(m_pDC->GetSafeHdc()); wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); return 0;}
void CMFCTestView::OnDestroy(){ CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 // 释放资源 wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hRC); delete m_pDC;}
这个类似于OpenGL中的ReShape函数:
void CMFCTestView::OnSize(UINT nType, int cx, int cy){ CView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 //二维图形显示: glViewport(0, 0, cx, cy); // 设置投影矩阵(透视投影) glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0); // 设置模型视图矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 显示三维图形的程序 /*glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity();*/}
添加绘图函数:OnDraw()
void CMFCTestView::OnDraw(CDC* /*pDC*/){ CStudyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 // 清除颜色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制场景 glMatrixMode(GL_MODELVIEW); glPushMatrix(); DrawPicture(); //为了更加明了,DrawPicture函数就是绘图的核心代码 glPopMatrix(); // 交换缓冲区 SwapBuffers(wglGetCurrentDC());}
四:添加绘图函数myDisplay()
代码自己用自己的啦,剩下的步骤都差不多了。
void drawCircle(float x, float y, float r) //画圆{ int n = 100; glBegin(GL_POLYGON); for (int i = 0; i < n; i++) { glVertex2f(r*cos(i * 2 * PI / n) + x, r*sin(i * 2 * PI / n) + y); } glEnd();}void CMFCTestView::myDisplay(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1, 1, 0); //外围黄色圆 drawCircle(0, 0, 0.7); glColor3f(1, 0, 0); //红色圆 drawCircle(0, 0, 0.65); glColor3f(1, 1, 0); //五角星(填充) glBegin(GL_TRIANGLE_FAN); glVertex2f(0, 0); for (int i = 0; i <= 10; i++) { if (i & 1) glVertex2f(0.25*sin(i * 2 * PI / 10), 0.25*cos(i * 2 * PI / 10)); else glVertex2f(0.65*sin(i * 2 * PI / 10), 0.65*cos(i * 2 * PI / 10)); } glEnd(); glColor3f(0, 0, 0); //五角星轮廓 for (int i = 0; i <= 10; i++) { float p1_x, p1_y, p2_x, p2_y; if (i & 1) { p1_x = 0.25*sin(i * 2 * PI / 10); p1_y = 0.25*cos(i * 2 * PI / 10); p2_x = 0.65*sin((i + 1) * 2 * PI / 10); p2_y = 0.65*cos((i + 1) * 2 * PI / 10); } else { p1_x = 0.65*sin(i * 2 * PI / 10); p1_y = 0.65*cos(i * 2 * PI / 10); p2_x = 0.25*sin((i + 1) * 2 * PI / 10); p2_y = 0.25*cos((i + 1) * 2 * PI / 10); } glBegin(GL_LINES); glVertex2f(0, 0); glVertex2f(p1_x, p1_y); glVertex2f(0, 0); glVertex2f(p2_x, p2_y); glVertex2f(p1_x, p1_y); glVertex2f(p2_x, p2_y); glEnd(); } glFlush();}
五:然后就可以愉快的运行啦:
- OpenGL+MFC编程入门(VS2013)
- VS2013 OpenGL MFC 编程问题
- MFC+OpenGL 编程入门
- VS2013/MFC编程入门之一
- VS2013/MFC编程入门之十五(对话框:消息对话框)
- VS2013/MFC编程入门之十六(对话框:文件对话框)
- VS2013/MFC编程入门之十七(对话框:字体对话框)
- VS2013/MFC编程入门之十八(对话框:颜色对话框)
- opengl的初始化(VS2013 MFC)
- VS2013/MFC编程入门之二(VS2013应用程序工程中文件的组成结构)
- VS2013/MFC编程入门之三十二(菜单:VS2013菜单资源详解)
- VS2013/MFC编程入门之一(利用MFC向导生成单文档应用程序框架)
- VS2013/MFC编程入门之三(MFC应用程序框架分析)
- VS2013/MFC编程入门之四(MFC消息映射机制概述)
- VS2013/MFC编程入门之三十九(MFC常用类:CString类)
- VS2013/MFC编程入门之二十二(常用控件:按钮控件的编程实例)
- VS2013/MFC编程入门之五(对话框:创建对话框模板和修改对话框属性)
- VS2013/MFC编程入门之六(对话框:为对话框添加控件)
- 阶乘末尾0的个数
- Codevs 1160 蛇形矩阵
- T-SQL中的运算符
- 20、网络IPC:套接字(1)
- android中的png与jpg的区别及使用场景
- OpenGL+MFC编程入门(VS2013)
- SpringView下拉刷新上拉加载
- [bzoj3339]mex(线段树)
- 【三分套三分】传送带
- hdu5995 H
- 倒三角形
- HSF和Dubbo有什么区别
- 上传图片到tomcat服务器中的images文件中
- 上传