• OpenGL(三)MFC中应用OpenGL的两个类


    • 网上找了下MFC中应用OpenGL的方法,总觉得不太方便,到处复制一堆堆函数,于是封装了两个类(CmyOpenGL和CRenderContex)。方便应用。
    • 以MFC Dialog为例添加步骤:
      • CXXXDlg中添加一CmyOpenGL成员(或指针,别忘记释放就行)
      • 将三个成员函数对应加入(OnCreate、OnPaint、OnSize)MFC的消息映射函数中,传递相应参数(CmyOpenGL要利用CDC*所指对象,因此CDC*要在CmyOpenGL对象之后释放!
    • 代码:
      • CmyOpenGL.h
         1 #pragma once
        2 #include "RenderContex.h"
        3
        4 class CmyOpenGL
        5 {
        6 public:
        7 CmyOpenGL(void);
        8 virtual ~CmyOpenGL(void);
        9 public:
        10 virtual void OnCreate(CDC* pDC);
        11 virtual void OnPaint(void);
        12 virtual void OnSize(int cx, int cy);
        13 private:
        14 virtual void RenderScene (void);
        15 private:
        16 CDC* m_pDC;
        17 CRenderContex* m_pRC;
        18 };
      • CmyOpenGL.cpp
         1 #include "StdAfx.h"
        2 #include "myOpenGL.h"
        3
        4 CmyOpenGL::CmyOpenGL(void)
        5 {
        6 m_pDC = NULL;
        7 m_pRC = NULL;
        8 }
        9
        10 CmyOpenGL::~CmyOpenGL(void)
        11 {
        12 if (m_pRC)
        13 {
        14 delete m_pRC;
        15 }
        16 m_pRC = NULL;
        17 }
        18
        19 void CmyOpenGL::OnCreate(CDC* pDC)
        20 {
        21 ASSERT(pDC);
        22 m_pRC = new CRenderContex(pDC);
        23 ASSERT(m_pRC);
        24
        25 m_pDC = pDC;
        26
        27 //Specify Black as the clear color
        28 ::glClearColor(0.0f,0.0f,0.0f,0.0f);
        29 }
        30
        31 void CmyOpenGL::OnPaint()
        32 {
        33 // Clear out the color & depth buffers
        34 ::glClear( GL_COLOR_BUFFER_BIT);
        35 RenderScene();
        36 // Tell OpenGL to flush its pipeline
        37 ::glFinish();
        38 // Now Swap the buffers
        39 ::SwapBuffers( m_pDC->GetSafeHdc() );
        40 }
        41
        42 void CmyOpenGL::OnSize(int cx, int cy)
        43 {
        44 if ( 0 >= cx || 0 >= cy )
        45 {
        46 return;
        47 }
        48 // select the full client area
        49 ::glViewport(0, 0, cx, cy);
        50 // select the projection matrix and clear it
        51 ::glMatrixMode(GL_PROJECTION);
        52 ::glLoadIdentity();
        53 // select the viewing volume
        54 ::gluPerspective(45.0f, (GLdouble)cx/(GLdouble)cy, 1.0f, 100.0f);
        55 // switch back to the modelview matrix and clear it
        56 ::glMatrixMode(GL_MODELVIEW);
        57 ::glLoadIdentity();
        58 }
        59
        60 void CmyOpenGL::RenderScene (void)
        61 {
        62 glTranslatef(0.0f, 0.0f, -5.0f);
        63 glRotatef(45.0,0.0,1.0,0.0);
        64 glutWireCube(1.0);
        65 }
      • CRenderContex.h
         1 #pragma once
        2
        3 class CRenderContex
        4 {
        5 public:
        6 CRenderContex(CDC *pDC);
        7 ~CRenderContex(void);
        8 private:
        9 BOOL SetupPixelFormat(CDC *pDC); //Set up the Pixel Format
        10 private:
        11 HGLRC m_hRC;
        12 };
      • CRenderContex.cpp
         1 #include "StdAfx.h"
        2 #include "RenderContex.h"
        3
        4 CRenderContex::CRenderContex(CDC *pDC)
        5 {
        6 ASSERT(pDC);
        7
        8 BOOL bResult = FALSE;
        9 bResult = SetupPixelFormat(pDC);
        10 ASSERT(bResult);
        11
        12 //Create Rendering Context
        13 m_hRC = ::wglCreateContext (pDC->GetSafeHdc ());
        14 ASSERT(m_hRC);
        15 //Make the RC Current
        16 bResult = ::wglMakeCurrent (pDC->GetSafeHdc (), m_hRC);
        17 ASSERT(bResult);
        18 }
        19
        20 CRenderContex::~CRenderContex(void)
        21 {
        22 BOOL bResult = FALSE;
        23 //Make the RC non-current
        24 bResult = ::wglMakeCurrent (0,0);
        25 ASSERT(bResult);
        26
        27 //Delete the rendering context
        28 bResult = ::wglDeleteContext (m_hRC);
        29 ASSERT(bResult);
        30 }
        31
        32 //Setup Pixel Format
        33 BOOL CRenderContex::SetupPixelFormat(CDC *pDC)
        34 {
        35 static PIXELFORMATDESCRIPTOR pfd =
        36 {
        37 sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
        38 1, // version number
        39 PFD_DRAW_TO_WINDOW | // support window
        40 PFD_SUPPORT_OPENGL | // support OpenGL
        41 PFD_DOUBLEBUFFER, // double buffered
        42 PFD_TYPE_RGBA, // RGBA type
        43 24, // 24-bit color depth
        44 0, 0, 0, 0, 0, 0, // color bits ignored
        45 0, // no alpha buffer
        46 0, // shift bit ignored
        47 0, // no accumulation buffer
        48 0, 0, 0, 0, // accum bits ignored
        49 16, // 16-bit z-buffer
        50 0, // no stencil buffer
        51 0, // no auxiliary buffer
        52 PFD_MAIN_PLANE, // main layer
        53 0, // reserved
        54 0, 0, 0 // layer masks ignored
        55 };
        56 int m_nPixelFormat = ::ChoosePixelFormat(pDC->GetSafeHdc(), &pfd);
        57 if ( m_nPixelFormat == 0 )
        58 {
        59 return FALSE;
        60 }
        61 if ( ::SetPixelFormat(pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
        62 {
        63 return FALSE;
        64 }
        65 return TRUE;
        66 }
    • 参考:http://www.cnblogs.com/phinecos/archive/2008/11/04/1326687.html
  • 相关阅读:
    解决span中的内容不换行
    javascript中apply、call和bind的区别
    vuex及其属性应用
    55.动态加载Html
    58.圆角图片
    57.动态添加子View(Java/XML两种方式)
    56.Java与js交互
    59.仿微信的图片浏览器
    64.判断当前线程是否是主线程
    61.自定义Indicator
  • 原文地址:https://www.cnblogs.com/dahai/p/2307800.html
Copyright © 2020-2023  润新知