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);
}





 

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

FreeGLUT Tips: 详解 glutInit 的入口参数

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

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:37
  • 2616

【OpenGL】详解第一个OpenGL程序

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

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

                                             GLUT教程                                                 ...
  • xie_zi
  • xie_zi
  • 2007-12-02 01:51:00
  • 10625

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

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

OpenGL入门学习

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。  2、强大的可移植性。  3、高性能的图形渲染。   总之,OpenGL是一个...
  • xiang_521
  • xiang_521
  • 2013-08-27 19:26:52
  • 10872

在VS2010里MFC对话框中使用OpenGL绘图,添加的控件不显示的一种解决方法

当我想在MFC对话框里一部分显示OpenGL图形,一部分显示滚动条和一些按钮等控件的时候,图形可以显示,但是控件不显示,网上很多人说是修改对话框的ClipChildren属性,我没搞明白,试了一下没有...
  • Main_3K10
  • Main_3K10
  • 2014-03-07 21:41:36
  • 1516

在对话框中dialog 创建简单opengl程序

前言:用opengl库在mfc 对话框程序中创建简单的opengl程序 开发环境:vs2010+opengl库  步骤: 1.用vs2010创建mfc dialog对话框程序 直接...
  • wangsky2
  • wangsky2
  • 2013-12-30 12:43:23
  • 7105

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

项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,而且是在MFC中的ActiveX中使用,再而且鉴于他们程序主框架的设定,常规的方法还不一定能实现。所以还是查过不少资料,在此一一总结...
  • lyh03601
  • lyh03601
  • 2014-08-21 16:10:21
  • 4037
收藏助手
不良信息举报
您举报文章:OpenGL入门14——MFC窗口中使用glut函数
举报原因:
原因补充:

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