制作一个基于MFC对话框的OpenGL类

来源:互联网 发布:大数据介绍 编辑:程序博客网 时间:2024/05/22 16:47
来源:http://www.yesky.com/342/1917842.shtml
在我的程序中,需要在一个小的对话框中创建一个OPENGL绘制窗口,所以略去了其中的全屏和常屏显示功能。
 
创建步骤如下:
1.创建一个新的类COpenGLWnd,基于CWnd类。
1.1 重载Create函数,在其中创建一个窗口用以绘制
void COpenGL::Create(CRect rect, CWnd *parent)
{
 if (m_bInit) return;
 ASSERT(rect);
 ASSERT(parent);
 m_rect = rect;
 m_parent = parent;
 CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_OWNDC,NULL,(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
 CreateEx(0,className,"OpenGL",WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS| WS_CLIPCHILDREN | CS_SAVEBITS,rect,parent,0);
}
1.2 创建消息映射函数OnCreate,OnPaint,OnSize函数,以及InitGL,KillGLWindow完成OPENGL绘制类的基本工作。RenderScene函数中OPENGL的场景渲染代码。
 
至此,OPENGL绘制窗口类已经被封装好,只需要在调用它的对话框类中将它实例化就OK了!
 
2. 在CMotionViewDlg类中,包含此绘制类的头文件。
2.1 在对话框中加入一个static控件,设置为不可见(取消visible选项);在OnInitDialog()中加人下面这段代码(假设控件ID为IDC_OPENGL,m_openGL是类COpenGL的对象): 
CRect rect;
GetDlgItem(IDC_OPENGL)->GetWindowRect(rect);
ScreenToClient(rect);
m_openGL.Create(rect, this);
2.2 在适当的地方调用RenderScene方法
void COpenGL::RenderGLScene()
{
 if(!m_bInit) return;
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
 glLoadIdentity();
 glTranslatef(0.0f,-30.0f,-200.0f);
 glRotatef(40.0, 0.0, 1.0, 0.0);
// 渲染代码测试
 glColor3f(0.5, 0.5, 0.5);
 glBegin(GL_LINES);
    for (int i = -100; i <= 100; i += 20)
 {
  glVertex3f(i, 0.0, -100.0);
  glVertex3f(i, 0.0, 100.0);
  glVertex3f(-100.0, 0.0, i);
  glVertex3f(100.0, 0.0, i);
 }
    glEnd();
 SwapBuffers(m_hDC); 
 Invalidate(FALSE);
}
0 0
原创粉丝点击