关于在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());
}
运行结果: