基于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(1.0f);
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(45.0f,m_aspect,0.1f,100.0f);
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环境,所以代码并不复杂,也很容易理解。