本文主要介绍如何在MFC框架下编写OpenGL程序。现有的OpenGL参考书多是介绍基于AUX库,或是基于GLUT库的Win32 OpenGL程序。这类程序结构非常简单,主要目的是让读者熟悉OpenGL语言的用法及功能。然而不得不承认,编写可视化程序MFC框架有其独到的优势,本文就是针对这种需求,详细介绍MFC框架下OpenGL程序的实现步骤。
编译器:Microsoft Visual Studio.NET 2003(中文版)
准备工作:下载OpenGL非标准额外GLUT库文件http://www.openglsource.com/download/download.htm(包括glut.h, glut32.lib, glut32.dll)。将glut.h放到目录VC2003.NET/Vc7/PlatformSDK/Include/gl下,glut32.lib放到目录VC2003.NET/Vc7/PlatformSDK/Lib下,再将glut32.dll放进WINDOWS/system32中,最后设置编译器的链接:【项目】-【属性页】-【链接器】-【输入】-【附加依赖项】-glut32.lib。
具体实现步骤:
1. 新建MFC多文档应用程序,项目名取为Render。
2. 新建两个文件WSDView.h和WSDView.cpp,并将这两个文件放入项目文件夹内。具体代码见附录。两文件的功能:创建类CWSDView,它继承自CView,成员函数包括设置像素格式,创建渲染描述表,各类鼠标消息相应函数如鼠标左键拖动,右键拖动及滚轴转动等。
3. 【文件】-【添加现有项】,选取WSDView.h, WSDView.cpp文件。
4. 在RenderView.h文件中添加代码 #include "WSDView.h",
将class CRenderView : public CView修改为class CRenderView : public CWSDView
在RenderView.cpp文件中修改IMPLEMENT_DYNCREATE(CRenderView, CView)为IMPLEMENT_DYNCREATE(CRenderView, CWSDView);修改 BEGIN_MESSAGE_MAP(CRenderView, CView)为BEGIN_MESSAGE_MAP(CRenderView, CWSDView)
5. 在CRenderView类中添加虚拟函数virtual void RenderScene(void)。实际上它是继承自父类CWSDView。
6. 在CRenderView::OnDraw(CDC* /*pDC*/)内添加代码:
// TODO: 在此处为本机数据添加绘制代码
//双缓存应用
static BOOL bBusy = FALSE;
if(bBusy) return;
bBusy = TRUE;
//背景色
glClearColor( 0.0f , 0.0f , 0.0f , 1.0f );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清缓存
glMatrixMode(GL_MODELVIEW);//启动模型矩阵
glLoadIdentity();//初始化模型矩阵
// 绘制动作
glTranslatef(0.0, 0.0, -8.0); //将场景移至可视区
RenderScene();//绘制场景
glFinish();//完成绘制
SwapBuffers(wglGetCurrentDC());//双缓存应用:更新缓存
bBusy = FALSE;
7. 在CRenderView::RenderScene(void)内添加代码:
glPushMatrix();
//控制操作如下,与鼠标消息相应函数相关:
glTranslatef(m_translateX, m_translateY, 0.0);
glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);
glScalef(m_scale, m_scale, m_scale);
//绘制实体 例如茶壶
glPushMatrix();
glColor 3f (0.5, 0.5, 0.5);
glutSolidTeapot(0.3);
glPopMatrix();
glPopMatrix();
Ok,至此基本框架已经搞定。按照上述步骤,编译运行显示结果:黑色