OpenGL入门14——MFC窗口中使用glut函数

原创 2015年04月23日 20:13:11

调用glut函数前,要初始化glut,即调用glutInit();

例如:

        int argc=1;
char* argv[]={"MFC_GLUT"};
glutInit(&argc, argv);


再写一下MFC中添加OpenGL配置和glut初始化

1、view.h中添加成员

HGLRC m_hRC;	//Rendering Context
CDC* m_pDC;		//Device Context


2、view.cpp中添加成员

BOOL CXXXView::SetupPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd = 
	{
		sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
		1,                              // version number
		PFD_DRAW_TO_WINDOW |            // support window
		PFD_SUPPORT_OPENGL |		    // support OpenGL
		PFD_DOUBLEBUFFER,				// double buffered
		PFD_TYPE_RGBA,                  // RGBA type
		24,                             // 24-bit color depth
		0, 0, 0, 0, 0, 0,               // color bits ignored
		0,                              // no alpha buffer
		0,                              // shift bit ignored
		0,                              // no accumulation buffer
		0, 0, 0, 0,                     // accum bits ignored
		16,                             // 16-bit z-buffer
		0,                              // no stencil buffer
		0,                              // no auxiliary buffer
		PFD_MAIN_PLANE,                 // main layer
		0,                              // reserved
		0, 0, 0                         // layer masks ignored
	};

	int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);

	if ( m_nPixelFormat == 0 )
	{
		return FALSE;
	}

	if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
	{
		return FALSE;
	}

	return TRUE;
}

BOOL CXXXView::InitializeOpenGL()
{
	//Get a DC for the Client Area
	m_pDC = new CClientDC(this);

	//Failure to Get DC
	if(m_pDC == NULL)
	{
		MessageBox("Error Obtaining DC");
		return FALSE;
	}

	//Failure to set the pixel format
	if(!SetupPixelFormat())
	{
		return FALSE;
	}

	//Create Rendering Context
	m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());

	//Failure to Create Rendering Context
	if(m_hRC == 0)
	{
		MessageBox("Error Creating RC");
		return FALSE;
	}

	//Make the RC Current
	if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE)
	{
		MessageBox("Error making RC Current");
		return FALSE;
	}

	//Specify Black as the clear color
	::glClearColor(0.0f,0.0f,0.0f,0.0f);

	//Specify the back of the buffer as clear depth
	::glClearDepth(1.0f);

	//Enable Depth Testing
	::glEnable(GL_DEPTH_TEST);

	return TRUE;
}

3、在CXXXView::OnCreate()中添加以下代码

// TODO:  在此添加您专用的创建代码
	if( !InitializeOpenGL() )
	{
		TRACE0( "InitializeOpenGL failed !");
		return -1;
	}


	//初始化glut
	int argc=1;
	char* argv[]={"<span style="font-size: 13.3333339691162px;">MFC_GLUT</span>"};
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);

4、在CXXXView::OnDestory()中添加以下代码

// TODO: 在此处添加消息处理程序代码
	if(::wglMakeCurrent (0,0) == FALSE)
	{
		MessageBox("Could not make RC non-current");
	}

	//Delete the rendering context
	if(::wglDeleteContext (m_hRC)==FALSE)
	{
		MessageBox("Could not delete RC");
	}

	//Delete the DC
	if(m_pDC)
	{
		delete m_pDC;
	}
	//Set it to NULL
	m_pDC = NULL;
5、在CXXXView::OnDraw()中添加以下代码

// TODO: 在此处为本机数据添加绘制代码
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
	//RenderScene();//添加自己的绘制函数
	// Tell OpenGL to flush its pipeline
	::glFinish();
	// Now Swap the buffers
	::SwapBuffers( m_pDC->GetSafeHdc() );
6、在CXXXView::OnEraseBkgnd()中,修改返回值为TRUE,来消除闪屏问题

BOOL CXXXView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	return TRUE;
	return CView::OnEraseBkgnd(pDC);
}





 

版权声明:本文为博主原创文章,未经博主允许不得转载。

FreeGLUT Tips: 详解 glutInit 的入口参数

通过读源代码,清楚该如何正确地构建 glutInit() 的入口参数。
  • XinYaping
  • XinYaping
  • 2015年06月19日 18:13
  • 4130

void glutInit(int *argc, char **argv); glut初始化API(1)

这个函数用来初始化 GLUT 库.这个函数从 main 函数获取其两个参数.对应main 函数的形式应是:int main(int argc,char* argv[]);...
  • guang_jing
  • guang_jing
  • 2014年06月04日 20:53
  • 2343

OpenGL---GLUT教程(二) GLUT初始化

                                             GLUT教程                                                 ...
  • xie_zi
  • xie_zi
  • 2007年12月02日 01:51
  • 10115

OpenGL内存泄漏之初始化函数glutInit()

      最近做些OpegGL上的开发,使用freeglut-2.6.0库,发现在MFC的对话框环境下,只要使用了函数glutInit(&__argc, __argv),就有内存泄漏,跟踪代码,发现...
  • ronggang175
  • ronggang175
  • 2010年12月10日 22:32
  • 3281

使用opengl及glut时解决“对‘glutInit’未定义的引用”的错误

使用opengl和glut编程时碰到这个问题: $ gcc  -lglut -lGL -lGLU test.c -o test /tmp/ccnLFWbi.o:在函数‘main’中: ...
  • ffbp89
  • ffbp89
  • 2017年03月07日 11:19
  • 637

【OpenGL】详解第一个OpenGL程序

OpenGL能做的事情太多了!很多程序也看起来很复杂。但是!所有O
  • candycat1992
  • candycat1992
  • 2014年11月26日 16:00
  • 59078

openGL编程GLUT配置和“helloworld”

老版本: GLUT代表OpenGL应用工具包,英文全称为OpenGL Utility Toolkit,是一个和窗口系统无关的软件包,它由Mark Kilgard在SGI时写的。作为AUX库的功能更强...
  • xuguangsoft
  • xuguangsoft
  • 2012年09月11日 11:15
  • 7131

OpenGL在MFC中的使用总结(一)——基本框架

项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,而且是在MFC中的ActiveX中使用,再而且鉴于他们程序主框架的设定,常规的方法还不一定能实现。所以还是查过不少资料,在此一一总结...
  • lyh03601
  • lyh03601
  • 2014年08月21日 16:10
  • 3567

OpenGL入门6——GLUT窗口

概述:        GLUT与任意窗口系统无关,使用GLUT子程序来建立和显示窗口可以使程序不依赖于任意的特定计算机。 函数:        glutInit( &argc, argv);//参数与...
  • xiaoxiaoyusheng2012
  • xiaoxiaoyusheng2012
  • 2014年12月29日 20:27
  • 2400

OpenGL---GLUT教程(三) GLUT窗口设置

                                        GLUT教程                                  为改造窗口做准备下载下面的VC工程并运行...
  • xie_zi
  • xie_zi
  • 2007年12月02日 13:22
  • 8216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL入门14——MFC窗口中使用glut函数
举报原因:
原因补充:

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