MFC 中配置OpenGL环境

来源:互联网 发布:货运软件哪个最好 编辑:程序博客网 时间:2024/06/05 16:57

MFC为编写Windows应用程序提供了极大的方便,程序员在编写Windows应用程序时,只需要几步就可以把一个程序的框架建立起来.该类极大的提高了编程者的开发效率,是个具有极大实用价值的工具.


下面我们编写MFC 的OpenGL 应用程序.

要搭建一个OpenGL基本框架,需要以下几步:

1)新建一个单文档工程“OpenGLMFC”

(2)给工程添加三个库文件“GLAUX.LIB、GLU32.LIB、OpenGL32.LIB”,这三个库文件一般在“C:\Program Files\Microsoft Visual Studio\VC98\Lib\”路径中。

(3)在“stdafx.h”文件中添加包含三个OpenGL的头文件

                                   #include<gl\gl.h>

                                  #include <gl\glu.h>

                                 #include <gl\glaux.h>

(4)通过类向导给视图类添加三个消息响应函数:

      OnInitialUpdate(),OnCreate(),OnSize()。

(5)给视图类添加三个成员变量:



                  CClientDC  *m_pDC;

                   HGLRCm_hRC; // 专门用于OpenGL的数据类型

                   CRectm_rect;

(6)       OnCreate()函数中添加如下代码,其中重点是bSetupPixelFormat()函数,

{if (CView::OnCreate(lpCreateStruct) == -1)return -1;m_pDC=new CClientDC(this);ASSERT(m_pDC!=NULL);if(!bSetupPixelFormat())return -1;   <span style="white-space:pre"></span>m_hRC=wglCreateContext(m_pDC->GetSafeHdc());wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);return 0;  }

bSetupPixelFormat()函数用于设置OpenGL基本图元格式,需要自定义添加,代码如下:

{  staticPIXELFORMATDESCRIPTOR 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 pixelformat; if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0) { MessageBox("choose failed"); return FALSE; } if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)     { MessageBox("set failed"); return FALSE; } return TRUE;  }

(7)在OnSize()函数中设置视口和场景大小。

{CView::OnSize(nType, cx, cy);wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);glViewport(0,0,cx,cy);   //设置视口glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0,1.0,500.0); //设置场景glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0,0.0,-10.0);glRotatef(0.0,0.0,1.0,0.0);Invalidate(FALSE);}

(8) 在OnInitialUpdate()函数中添加初始化光照、材质等特性的代码

{CView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base classwglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);float position0[]={-3.0,3.0,3.0,0.0};float local_view[]={0.0};float position1[]={-3.0f,-3.0f,-3.0f,0.0f};float light1_ambient[]={0.2f,0.2f,0.2f};float light1_diffuse[]={0.1f,0.2f,0.2f};float position2[]={-50.0f,100.0f,-300.0f,0.0f};float light2_ambient[]={0.2f,0.2f,0.2f};float light2_diffuse[]={0.1f,0.2f,0.2f};glLightfv(GL_LIGHT0,GL_POSITION,position0);glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);        glLightfv(GL_LIGHT1,GL_AMBIENT,light1_ambient);glLightfv(GL_LIGHT1,GL_POSITION,position1);glLightfv(GL_LIGHT2,GL_DIFFUSE,light2_diffuse);        glLightfv(GL_LIGHT2,GL_AMBIENT,light2_ambient);glLightfv(GL_LIGHT2,GL_POSITION,position2);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_LIGHT2);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);GetClientRect(&m_rect);glClearColor(0.0,1.0,1.0,1.0);glClearDepth(1.0f);        glEnable(GL_DEPTH_TEST);        glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);glEnable(GL_BLEND);        glEnable(GL_LINE_SMOOTH);wglMakeCurrent(NULL,NULL);}

(9) 在OnDraw()函数中添加代码如下:


 

 

        wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);          auxSolidBox(1.6,0.6,0.4);         glTranslatef(0.0,3.0,0.0);         auxSolidBox(0.6,0.6,0.4);          glFlush();         SwapBuffers(wglGetCurrentDC());

 

我们用自己构造的来绘制个简单的图形





1 0