搭建基于MFC的OpenGL应用程序框架----初学OpenGL搭建基于MFC的OpenGL应用程序框架2/7搭建基于MFC的OpenGL应用程序框架一、GLUT在Windows环境下的相关配置(GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装):以我的安装目录为例:(1)“C:\ProgramFiles\MicrosoftVisualStudio\VC98\include\GL文件夹”。把glut.h放到这个GL文件夹里(如果没有GL文件夹可以自己建一个,一般都有的)。(2)“C:\ProgramFiles\MicrosoftVisualStudio\VC98\lib文件夹”)。把glut.lib和glut32.lib放到静态函数库所在文件夹(即lib文件夹)。(3)把glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32)这是非常重要的动态链接库设置。二、新建“MFCAppWizard(exe)”工程,并选择单文档。三、在Project-Settings-link的Object/librarymodules中添加以下信息opengl32.libGlut32.libGlaux.libglu32.lib。说明:glut是glut工具包提供的函数;glaux是OPENGL的辅助函数。四、在视类头文件mfc_openglView.h中添加头文件(#includegl/gl.h和搭建基于MFC的OpenGL应用程序框架3/7#includegl/glut.h)。五、因为OpenGL要求窗口有WS_CLIPCHILDREN和WS_CLIPSIBLINGS的风格。代码如下:BOOLCMfc_openglView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcscs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS);returnCView::PreCreateWindow(cs);}六、创建一个着色描述表的第一步是定义窗口的象素格式。这个象素格式描述了在窗口中展示的图形如何在内存中描绘。由象素格式控制的参数包括:颜色深度、缓冲区材质和支持的画图界面。首先在CGLSample1View类中创建一个新的名为“BOOLSetWindowPixelFormat(HDChDC)”的私有成员函数。代码如下:BOOLCMfc_openglView::SetWindowPixelFormat(HDChDC){PIXELFORMATDESCRIPTORpfd={sizeof(PIXELFORMATDESCRIPTOR),//pdf的大小1,//版本号PFD_DRAW_TO_WINDOW|//支持窗口PFD_DRAW_TO_BITMAP|PFD_SUPPORT_GDI|PFD_STEREO_DONTCARE|PFD_SUPPORT_OPENGL|//支持0PENGLPFD_DOUBLEBUFFER,//双缓存PFD_TYPE_RGBA,//RGBA类型24,//24位颜色深度0,0,0,0,0,0,//忽略颜色位0,//无alpha缓存0,//忽略转换位搭建基于MFC的OpenGL应用程序框架4/70,//无累计缓存0,0,0,0,//忽略累计位32,//32位深度缓存0,//无模板缓存0,//无辅助缓存PFD_MAIN_PLANE,//主层0,//保留0,0,0};this-m_GLPixelIndex=ChoosePixelFormat(hDC,&pfd);if(this-m_GLPixelIndex==0){this-m_GLPixelIndex=1;if(0==DescribePixelFormat(hDC,this-m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)){returnfalse;}}if(SetPixelFormat(hDC,this-m_GLPixelIndex,&pfd)==false){returnfalse;}returntrue;}七、在CGLSample1View类中添加如下的成员变量HGLRCm_hGLContext;//protectedintm_GLPixelIndex;八、创建着色描述表(RC)并且将其设为当前的。首先我们要添加一个名为搭建基于MFC的OpenGL应用程序框架5/7BOOLCreateViewGLContext(HDChDC)的保护型成员函数到CGLSample1View类中。代码如下:BOOLCMfc_openglView::CreateViewGLContext(HDChDC){this-m_hGLContext=wglCreateContext(hDC);if(this-m_hGLContext==NULL){returnfalse;}if(wglMakeCurrent(hDC,this-m_hGLContext)==false){returnfalse;}returntrue;}九、添加CGLSample1View类的消息处理函数OnCreate函数intCMfc_openglView::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CView::OnCreate(lpCreateStruct)==-1)return-1;//TODO:AddyourspecializedcreationcodehereHWNDhWnd=this-GetSafeHwnd();HDChDC=::GetDC(hWnd);if(this-SetWindowPixelFormat(hDC)==false){return0;}if(CreateViewGLContext(hDC)==false){搭建基于MFC的OpenGL应用程序框架6/7return0;}return0;}十、添加CGLSample1View类的消息处理函数OnDestroy函数voidCMfc_openglView::OnDestroy(){CView::OnDestroy();//TODO:Addyourmessagehandlercodehereif(wglGetCurrentContext()!=NULL){wglMakeCurrent(NULL,NULL);}if(this-m_hGLContext!=NULL){wglDeleteContext(this-m_hGLContext);this-m_hGLContext=NULL;}}十一、在视类的构造函数中初始化变量CMfc_openglView::CMfc_openglView(){//TODO:addconstructioncodeherethis-m_hGLContext=NULL;this-m_GLPixelIndex=0;}十二、在视类中添加成员函数DrawScene(),绘制三维场景。十三、在视类中的OnDraw(CDC*pDC)中添加以下代码,进行对DrawScene()的搭建基于MFC的OpenGL应用程序框架7/7调用。wglMakeCurrent(pDC-m_hDC,m_hGLContext);DrawScene();wglMakeCurrent(pDC-m_hDC,NULL);SwapBuffers(pDC-m_hDC);十四、为视类添加消息处理函数WM_SIZE,在OnSize(UINTnType,intcx,intcy)中添加以下代码。CView::OnSize(nType,cx,cy);//TODO:AddyourmessagehandlercodehereGLsizeiwidth,height;GLdoubleaspect;width=cx;height=cy;if(0==cy)aspect=(GLdouble)width;elseaspect=(GLdouble)width/(GLdouble)height;glViewport(0,0,width,height);//设置视区尺寸//以下两行是重置坐标系统,使投影变换复位glMatrixMode(GL_PROJECTION);glLoadIdentity();//gluOrtho2D(0.0,500.0*aspect,0.0,500.0);用于二维图片gluPerspective(45.0,aspect,1.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glDrawBuffer(GL_BACK);十五、文档说明:对于非自己创建的函数,添加的代码标识为红色。