基于MFC下的OpenGL框架
来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:21:51
创建一个SDI(单文档)MFC应用程序
这里项目名称叫做MFCOpenGL,视图类名叫做CMFCOpenGLView
在CMFCOpenGLView类的.h文件中,加入OpenGL的运行库
#include
#include
#include
将opengl32.lib glu32.lib glaux.lib加入到工程中,方法:在Project->Settings->Link->Object/library modules中输入opengl32.lib glu32.lib glaux.lib,不要忘记空格.
在CMFCOpenGLView类中加入成员函数
//函数功能:设置屏幕像素格式
BOOL CMFCOpenGLView::SetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd ={
sizeof(PIXELFORMATDESCRIPTOR), // 结构大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 格式支持双缓冲
PFD_TYPE_RGBA, // 申请RGBA格式
24, // 色彩深度,此处为24位
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift位
0, // 无累加缓存
0, 0, 0, 0, // 忽略聚集位
32, // 32位 Z-缓存(深度缓存)
0, // 无蒙板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // Reserved
0, 0, 0 // 忽略层遮罩
};
int pixelformat;
if ((pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
//函数功能:使用客户区的DC创建并初始化渲染环境,渲染环境创建成功,我们就可以在上面绘画了!
void CMFCOpenGLView::InitOpenGL()
{
m_pDC= new CClientDC(this); //创建DC
ASSERT(m_pDC != NULL);
if (!SetupPixelFormat()) //设定绘图的位图格式,函数下面列出
return;
m_hRC= wglCreateContext(m_pDC->m_hDC);//创建 RC
wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联
glShadeModel(GL_SMOOTH);
glClearColor(0.0,0.0,0.0,0.5);
glClearDepth(
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
}
//函数功能:当窗口大小(WM_SIZE消息)发生改变时调用,参数w,h是改变后的窗口大小
GLvoid CMFCOpenGLView::SceneResizeViewport(GLsizei w, GLsizei h)
{
if(h==0)
h=1;
m_aspect=(GLfloat)w/(GLfloat)h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//函数功能:释放、删除RC,做些清理的工作
void CMFCOpenGLView::DisableOpenGL()
{
wglMakeCurrent(m_pDC->m_hDC,NULL); // 释放与m_hDC 对应的 RC
wglDeleteContext(m_hRC); // 删除 RC
if (m_pDC)
delete m_pDC; //删除当前 View 拥有的 DC
}
//函数功能:绘画,这里只是创建一个框架,所以没有绘画的代码
void CMFCOpenGLView::DrawScene() //绘画场景
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
在PreCreateWindow函数中加入如下语句:
cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
响应WM_CREATE消息的OnCreate函数;
加入如下语句:
InitOpenGL();
SetTimer(1,1,NULL); //设置时钟
响应WM_TIMER消息的OnTimer函数;
加入如下语句:
Invalidate();
响应WM_SIZE消息的OnSize函数;
加入如下语句:
SceneResizeViewport((GLfloat)cx,(GLfloat)cy);
响应WM_ERASEBKGND消息的OnEraseBKgnd函数;
修改如下:
return TRUE;
// return CView::OnEraseBkgnd(pDC); //将这条语句注释,并直接return TRUE;
响应WM_DESTROY消息的OnDestroy函数;
加入如下语句:
DisableOpenGL();
在OnDraw()函数中
加入如下语句:
DrawScene();
这里我并没有给全部的代码,只是给出所添加的代码。并且只是一个MFC框架下的OpenGL环境,所以代码并不复杂,也很容易理解。