- 网上找了下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 }
- CmyOpenGL.h
- 参考:http://www.cnblogs.com/phinecos/archive/2008/11/04/1326687.html