单文档视图结构中利用OpenGL绘制图形

这次介绍在MFC下单文档视图结构中绘制三维图形的一些步骤.
(1)    创建一个新的工程,新建一个基于单文档(SDI)的工程,名称为SDOpenGL.    
(2)    添加OpenGL库.
        Project->Settings...->Link标签下,在"Object/library Module"编辑框中加入"opengl32.lib
        glu32.lib",(中间为空格),确定.
(3)    添加消息响应函数.WM_CREATE,WM_DESTROY,WM_SIZE的响应函数.
(4)    修改StdAfx.h文件
        #include <gl/gl.h>
        #include <gl/glaux.h>
        #include <gl/glu.h>                     
(5)    修改SDOpenGLView.h文件
    //添加成员函数和成员变量
    BOOL RenderSene();//
    BOOL SetupPixelFormat();
    BOOL InitializeOpenGL(CDC* pDC);    
    
    HGLRC    m_hRC;    //OpenGL绘制描述表
    CDC *m_pDC;    //OpenGL设备描述表
(6)    修改SDOpenGLView.cpp文件    

        void CSDOpenGLView::OnDraw(CDC* pDC)
        {
            CSDOpenGLDoc* pDoc = GetDocument();
            ASSERT_VALID(pDoc);
            // TODO: add draw code for native data here
            //
                RenderScene();    //渲染场景
            //
        }
        
        int CSDOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
        {
            if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;
            
            // TODO: Add your specialized creation code here
            //
            //初始化OpenGL
            m_pDC = new CClientDC(this);
            InitializeOpenGL(m_pDC);
            //
            
            return 0;
        }
        
        void CSDOpenGLView::OnDestroy()
        {
            CView::OnDestroy();
            
            // TODO: Add your message handler code here
            /
            //删除调色板和渲染上下文、定时器
            ::wglMakeCurrent(0,0);
            ::wglDeleteContext( m_hRC);
            if (m_hPalette)
                DeleteObject(m_hPalette);
            if ( m_pDC )
            {
                delete m_pDC;
            }  
            /
        }
        
        void CSDOpenGLView::OnSize(UINT nType, int cx, int cy)
        {
            CView::OnSize(nType, cx, cy);
            
            // TODO: Add your message handler code here
        /
        //添加窗口缩放时的图形变换函数
            glViewport(0,0,cx,cy);........
        /
            
        }
        //
        //                        初始化openGL场景
        //
        BOOL CSDOpenGLView::InitializeOpenGL(CDC* pDC)
        {
            m_pDC = pDC;
            SetupPixelFormat();
            //生成绘制描述表
            m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
            //置当前绘制描述表
            ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
        
            return TRUE;
        }
        
        //
        //                        设置像素格式
        //
        BOOL CSDOpenGLView::SetupPixelFormat()
        {
            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);    //设置像素格式
            return TRUE;
        }
        
        //
        //                        场景绘制与渲染
        //
        BOOL CSDOpenGLView::RenderScene()
        {
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色
            glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存
            glColor3f(0.2f, 0.6f, 1.0f);//绘图颜色
            ............//绘制函数
            ::SwapBuffers(m_pDC->GetSafeHdc());        //交互缓冲区!!!
            return TRUE;
        }

具体参考:http://hi.baidu.com/lion_luoluo/blog/item/3e7dcb3d5c3f79c79e3d6200.html

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值