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

关于在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());
}

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

  • 37
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
在 Visual C++ 中,可以按照以下步骤创建 MFC 应用程序并添加 OpenGL 控件: 1. 打开 Visual Studio,选择创建一个新项目。 2. 在创建新项目的向导中,选择“MFC 应用程序”并点击“下一步”。 3. 选择“桌面应用程序”并点击“下一步”。 4. 在“应用程序类型”中选择“单文档”或“多文档”,并点击“下一步”。 5. 在“高级特性”中勾选“使用 OpenGL”并点击“完成”。 6. 在类视图中打开“MainFrm.cpp”文件,在 `CMainFrame::OnCreate()` 函数中添加以下代码: ```C++ m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL); ``` 7. 在类视图中打开“MainFrm.h”文件,在 `CMainFrame` 类的末尾添加以下代码: ```C++ protected: CView m_wndView; ``` 8. 在类视图中打开“View.cpp”文件,在 `CView::OnDraw()` 函数中添加以下代码: ```C++ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glFlush(); ``` 9. 在类视图中打开“View.h”文件,在 `CView` 类的末尾添加以下代码: ```C++ protected: HGLRC m_hglrc; ``` 10. 在 `CView` 类的 `OnCreate()` 函数中添加以下代码: ```C++ PIXELFORMATDESCRIPTOR pfd; int nPixelFormat; // Get the device context (DC) HDC hdc = ::GetDC(m_hWnd); // Set the pixel format descriptor ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; // Choose a pixel format that best matches that described in pfd nPixelFormat = ::ChoosePixelFormat(hdc, &pfd); // Set the pixel format for the device context ::SetPixelFormat(hdc, nPixelFormat, &pfd); // Create a rendering context (RC) m_hglrc = wglCreateContext(hdc); // Make the RC current wglMakeCurrent(hdc, m_hglrc); ``` 11. 在 `CView` 类的 `OnDestroy()` 函数中添加以下代码: ```C++ // Get the device context (DC) HDC hdc = ::GetDC(m_hWnd); // Make the RC not current wglMakeCurrent(hdc, NULL); // Delete the RC wglDeleteContext(m_hglrc); ``` 12. 在 `CView` 类的 `OnSize()` 函数中添加以下代码: ```C++ // Get the device context (DC) HDC hdc = ::GetDC(m_hWnd); // Set the viewport glViewport(0, 0, cx, cy); // Set the projection matrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)cx / (GLfloat)cy, 0.1f, 100.0f); // Set the modelview matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Release the device context ::ReleaseDC(m_hWnd, hdc); ``` 这样,您就可以在 MFC 应用程序中添加 OpenGL 控件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值