OpenGL在MFC程序中的配置及使用

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

关于在MFC中使用OpenGL绘图,我在网上参考了许多教程,感觉很杂很乱,因此走了不少弯路。在此写下这篇教程,希望能帮助更多像我这样的新手。
注:你的电脑可不必事先配置好OpenGL环境

创建MFC程序

在这里插入图片描述
点击 确定,下一步,选择单文档,mfc标准,完成。
在这里插入图片描述
点击运行项目
在这里插入图片描述

项目中添加OpenGL环境

点击
在这里插入图片描述
搜索:nupengl
在这里插入图片描述
选择第二个包,点击安装
在这里插入图片描述

这时,你的项目中就包括OpenGL的所有文件了,就不必那么繁琐的配置OpenGL的开发环境了。当然,你每新建一个项目,就得再执行一遍这个步骤。

stdafx.h 文件中引用OpenGL
在这里插入图片描述
在这里插入图片描述
最终就是这样
在这里插入图片描述

MFC与OpenGL结合

1,在xxxxxView.h里面添加变量

private:
    HGLRC m_hRC;
    CClientDC* m_pDC;

2,在xxxxxView.cpp里面添加自定义函数setPixelFormat(),用于设置像素格式
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
点击完成,在函数中加入

bool CMFCOpenGLView::setPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR), // 结构的大小  
		1, // 结构的版本  
		PFD_DRAW_TO_WINDOW | // 在窗口(而不是位图)中绘图  
		PFD_SUPPORT_OPENGL | // 支持在窗口中进行OpenGL调用  
		PFD_DOUBLEBUFFER, // 双缓冲模式  
		PFD_TYPE_RGBA, // RGBA颜色模式  
		32, // 需要32位颜色  
		0, 0, 0, 0, 0, 0, // 不用于选择模式  
		0, 0, // 不用于选择模式  
		0, 0, 0, 0, 0, // 不用于选择模式  
		16, // 深度缓冲区的大小  
		0, // 在此不使用  
		0, // 在此不使用  
		0, // 在此不使用  
		0, // 在此不使用  
		0, 0, 0 // 在此不使用  
	};
	// 选择一种与pfd所描述的最匹配的像素格式  
	// 为设备环境设置像素格式  
	int pixelformat;
	pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
	if (0 == pixelformat) return false;
	// 为设备环境设置像素格式  
	return SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd);
	return false;
}

3,在xxxxxView.cpp里面添加OnCreate()函数,创建窗口时调用
在这里插入图片描述
在这里插入图片描述

int CMFCOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	// 创建DC  

	m_pDC = new CClientDC(this);
	ASSERT(m_pDC != NULL);
	// 选择像素格式  
	if (!setPixelFormat()) return -1;
	// 创建渲染环境, 并使它成为当前渲染环境  
	m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
	return 0;
}

4,同理,在xxxxxView.cpp里面添加OnDestroy()函数

void CMFCOpenGLView::OnDestroy()
{
	CView::OnDestroy();

	// TODO:  在此处添加消息处理程序代码
	wglMakeCurrent(NULL, NULL);
	wglDeleteContext(m_hRC);
	delete m_pDC;
}

5,添加函数OnInitialUpdate(),类似于OpenGL里面的OnInit()函数
在这里插入图片描述

void CMFCOpenGLView::OnInitialUpdate()
{
	CView::OnInitialUpdate();
	// TODO:  在此添加专用代码和/或调用基类
	glClearColor(1, 1, 1, 1);
}

5,同方法,添加OnSize()函数,类似于OpenGL里面的Reshape()函数

void CMFCOpenGLView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	// TODO:  在此处添加消息处理程序代码
	glViewport(0, 0, cx, cy);
	// 设置投影矩阵(透视投影)  
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0);
	// 设置模型视图矩阵  
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	// 显示三维图形的程序
	/*glViewport(0, 0, width, height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();*/
}

至此框架已经搭建完成。

简单画线实验

在这里插入图片描述
在这里插入图片描述
右键,添加事件处理函数
在这里插入图片描述
设置函数名
在这里插入图片描述

void CMFCOpenGLView::OnOpenglDrawline()
{
	// TODO: 在此添加命令处理程序代码
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();

	glColor3f(1.0,0.0,0.0);
	glLineWidth(3);
	glBegin(GL_LINES);
		glVertex2f(-0.5, 0.5);
		glVertex2f(-0.5, -0.5);
	glEnd();
	
	glPopMatrix();
	// 交换缓冲区  
	SwapBuffers(wglGetCurrentDC());
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/augustu1/article/details/84713641
今日推荐