一直想系统的学习MFC,感觉网上的关于这方面的好杂好乱,好多都看不懂(可能由于太菜233.)
看了几位大神的博客,终于明白了点,记录一下自己的学习过程吧
一、新建项目
二、选择多文档,MFC标准,点击完成
三、运行结果
四、导入必要的文件
1. 在<stdafx.h >里面加入一些常用的头文件
#include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h> #include <stdio.h> #include <math.h>
2.在项目中加入OpenGL的lib库
选中项目,鼠标右键点击
选中属性,找到配置属性/链接器/输入/附加依赖项
写入需要使用的lib文件
四、在程序里面添加函数和变量
<1>在---View.h里面添加变量
private: HGLRC m_hRC; CClientDC* m_pDC;
<2>在--View.cpp里面添加自定义函数bSetDCPixelFormat(),用于设置像素格式
bool CStudy01View::bSetDCPixelFormat() { 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 pixelformat; pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd); if (0 == pixelformat) return false; // 为设备环境设置像素格式 return SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); return FALSE; // } }
3)在View.cpp里面添加OnCreate()函数,创建窗口时调用
int CStudy01View::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; }
(4)添加OnDestroy() 函数,同OnCreate函数的添加过程
void CStudy01View::OnDestroy() { CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hRC); delete m_pDC; }
(5)修改OnDraw()函数,画图时调用该函数
void CStudyView::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()); }
(6)添加绘图自定义函数DrawPicture(),就是OpenGL里面的Display()函数
(7)添加函数OnInitialUpdate(),类似于OpenGL里面的OnInit()函数
void CStudy01View::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: 在此添加专用代码和/或调用基类 glClearColor(1, 1, 1, 1); }
(8)添加OnSize()函数,类似于OpenGL里面的Reshape()函数
void CStudy01View::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();*/ }
五
把定义的类和方法写入---View.h头文件里面,方便调用
到此,基本工作就OK了。