MFC 中配置OpenGL环境

原创 2016年03月09日 09:45:49

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基本图元格式,需要自定义添加,代码如下:

{  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 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 class
	wglMakeCurrent(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());

 

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





版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoge132/article/details/50832813

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架                                                             ...
  • sinat_24206709
  • sinat_24206709
  • 2016-03-09 15:40:58
  • 1725

直接在MFC的对话框上利用OpenGL绘制图形

借鉴前人的经验,如链接http://www.cnblogs.com/phinecos/archive/2007/07/28/834916.html介绍了如何利用MFC的单文档来使用OpenGL(本文也...
  • hurricanecqj
  • hurricanecqj
  • 2015-05-01 15:20:46
  • 1918

MFC搭建OpenGL框架示例

本文以SDI文档结构为例,列出绘制OpenGL图形的关键步骤; (1)在单文档窗口的创建过程中设置好显示的像素格式,并按OpengL的要求设置好窗口的属性和风格 (2)获得Windows设...
  • wang15061955806
  • wang15061955806
  • 2015-10-12 14:49:11
  • 1173

VS2012 +MFC+ OPenGL环境搭建

这里以MFC单文档程序为例。框架的代码是基于NEHE的OPenGL教程的,应该放在负责视图的View.cpp中,笔者的项目名叫迷宫,故类名为C迷宫View,下面是主要步骤: 一. 在MFC中的View...
  • hf19931101
  • hf19931101
  • 2015-12-23 19:48:00
  • 1286

VS 2012环境下使用MFC进行OpenGL编程

VS 2012下使用MFC+OpenGL基本步骤 引子:以前一直惧怕MFC感觉它是一个非常复杂的东西,更不用说去用它来和OpenGL结合了,以前是一直羡慕别人用MFC创建一个窗口进行OpenGL绘图...
  • bbppbb
  • bbppbb
  • 2014-04-22 21:11:59
  • 7102

VS2013用MFC制作包含菜单的OpenGL程序

打开VS2013新建项目 MFC程序:命名为:MFCOpenGLDemo 单击确定 下一步建一个基于对话框的程序 单击完成:...
  • Tan_HandSome
  • Tan_HandSome
  • 2015-08-01 09:42:23
  • 1840

MFC下OpenGL绘图框架

MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的。 2, 添加链接库。这...
  • u012953777
  • u012953777
  • 2017-03-20 19:52:12
  • 157

如何在VC++中用MFC进行OpenGL编程

  • 2017年09月07日 12:15
  • 262KB
  • 下载

基于MFC的OpenGL绘图

一、简介     GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令...
  • linyijiong
  • linyijiong
  • 2016-12-22 22:00:34
  • 313

基于OpenGL显示平台功能开发-MFC框架篇

基于OpenGL显示平台功能开发-MFC框架篇简介关于OpenGL MFC应用程序框架的搭建,大家可以在网上找到很多相关的历程。而且按照历程的步骤,基本上可以很顺利地搭建出来。为了更能充分的帮助读者了...
  • junbincc02
  • junbincc02
  • 2016-10-25 08:09:13
  • 311
收藏助手
不良信息举报
您举报文章:MFC 中配置OpenGL环境
举报原因:
原因补充:

(最多只允许输入30个字)