zoukankan      html  css  js  c++  java
  • (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);

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    Vue的配置安装与项目创建
    log4j:WARN No appenders could be found for logger
    终于在博客园扎根了
    简单工厂模式
    详解apache防盗链网站图片防盗链方法
    怎样能写好文章标题
    生活需要阿Q精神
    2013个人博客全新起航
    华中师范大学新生网上怎么选宿舍
    华中师范大学2012级新生QQ交流群欢迎加入!
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2417600.html
Copyright © 2011-2022 走看看