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
原文地址:https://www.cnblogs.com/dahai/p/2307800.html