(2)MFC+openGL单文档框架glFrame

2011-07月份写的文章,OpenGL很久不弄了,把它转到博客园,以后如果要用再学习吧!

源码下载:http://download.csdn.net/source/3418661

1.搭载gl环境并设置项目属性

2.在stdafx.h中添加引用

// 包含有关OpenGL函数的头文件
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
#include <gl/glut.h>

3.添加变量

 // OpenGL绘制描述表
 HGLRC m_hRC;
 // OpenGL调色板
 HPALETTE m_hPalette;
 // OpenGL设备描述表
 CDC* m_pDC;

4.添加函数:

private:
 void SetLogicalPalette(void);
 // 初始化openGL场景
 bool InitializeOpenGL(CDC* pDC);
 // 设置像素格式
 bool SetupPixelFormat(void);
 // 场景绘制与渲染
 bool RenderScene(void);

5.添加代码

int CglFrameView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您专用的创建代码
//////////////////////////////////////////////////////////////////
//初始化OpenGL和设置定时器
 m_pDC = new CClientDC(this);
 SetTimer(1, 2000, NULL);
 InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////
 return 0;
}

BOOL CglFrameView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改
 //  CREATESTRUCT cs 来修改窗口类或样式
    //设置窗口类型
 cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
 return CView::PreCreateWindow(cs);
}

void CglFrameView::OnDraw(CDC* /*pDC*/)
{
 CglFrameDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;
 // TODO: 在此处为本机数据添加绘制代码
 //渲染场景
 RenderScene();
}

void CglFrameView::OnDestroy()
{
 CView::OnDestroy();

 // TODO: 在此处添加消息处理程序代码
 /////////////////////////////////////////////////////////////////
//删除调色板和渲染上下文、定时器
 ::wglMakeCurrent(0,0);
 ::wglDeleteContext( m_hRC);
 if (m_hPalette)
     DeleteObject(m_hPalette);
 if ( m_pDC )
 {
  delete m_pDC;
 }
   
/////////////////////////////////////////////////////////////////
}

void CglFrameView::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);

 // TODO: 在此处添加消息处理程序代码
 //添加窗口缩放时的图形变换函数
 glViewport(0,0,cx,cy);
}

void CglFrameView::SetLogicalPalette(void)
{
  struct
    {
        WORD Version;
        WORD NumberOfEntries;
        PALETTEENTRY aEntries[256];
    } logicalPalette = { 0x300, 256 };

 BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
 BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
 BYTE blues[] = {0, 85, 170, 255};

    for (int colorNum=0; colorNum<256; ++colorNum)
    {
        logicalPalette.aEntries[colorNum].peRed =
            reds[colorNum & 0x07];
        logicalPalette.aEntries[colorNum].peGreen =
            greens[(colorNum >> 0x03) & 0x07];
        logicalPalette.aEntries[colorNum].peBlue =
            blues[(colorNum >> 0x06) & 0x03];
        logicalPalette.aEntries[colorNum].peFlags = 0;
    }

    m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
}

// 初始化openGL场景
bool CglFrameView::InitializeOpenGL(CDC* pDC)
{
 m_pDC = pDC;
 SetupPixelFormat();
 //生成绘制描述表
 m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
 //置当前绘制描述表
 ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

 return TRUE;
}

// 设置像素格式
bool CglFrameView::SetupPixelFormat(void)
{
 PIXELFORMATDESCRIPTOR pfd = {
     sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小
     1,                                // 版本号
     PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图
     PFD_SUPPORT_OPENGL |              // 支持 OpenGL
     PFD_DOUBLEBUFFER,                 // 双缓存模式
     PFD_TYPE_RGBA,                    // RGBA 颜色模式
     24,                               // 24 位颜色深度
     0, 0, 0, 0, 0, 0,                 // 忽略颜色位
     0,                                // 没有非透明度缓存
     0,                                // 忽略移位位
     0,                                // 无累加缓存
     0, 0, 0, 0,                       // 忽略累加位
     32,                               // 32 位深度缓存    
     0,                                // 无模板缓存
     0,                                // 无辅助缓存
     PFD_MAIN_PLANE,                   // 主层
     0,                                // 保留
     0, 0, 0                           // 忽略层,可见性和损毁掩模
 };  
 int pixelformat;
 pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
 ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
 if(pfd.dwFlags & PFD_NEED_PALETTE)
  SetLogicalPalette(); //设置逻辑调色板
 return TRUE;
}

// 场景绘制与渲染
bool CglFrameView::RenderScene(void)
{
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.2f, 0.6f, 1.0f);
 ::auxWireSphere(0.5);
 ::auxWireBox (0.1,0.2,0.1);
 ::auxWireCone (0.3,0.4);
 ::SwapBuffers (m_pDC->GetSafeHdc());  //交互缓冲区
 return TRUE;
}

BOOL CglFrameView::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 //return CView::OnEraseBkgnd(pDC);
 return true;
}

 //OnTImer函数可以不用

void CglFrameView::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 //添加定时器响应函数和场景更新函数
    Invalidate(FALSE); 
 CView::OnTimer(nIDEvent);

posted @ 2012-03-26 11:26  太一吾鱼水  阅读(462)  评论(0编辑  收藏  举报