MFC搭建OpenGL框架示例

原创 2015年10月12日 14:49:11

本文以SDI文档结构为例,列出绘制OpenGL图形的关键步骤;

(1)在单文档窗口的创建过程中设置好显示的像素格式,并按OpengL的要求设置好窗口的属性和风格

(2)获得Windows设备描述表CDC的成员变量,然后将其与OpengL的绘制描述表RC联系起来

(3)调用OpenGL命令进行图形绘制

(4)退出OpengL图形窗口时,释放OpengL的绘制描述表RC和Windows设备描述表DC

手动添加的代码用magenta表示。这里先叙述一下创建步骤:

1.新建一个MFC向导程序,命名为GLFrame,单文档,去除打印支持,其余默认,生成一个OpenGL框架.

2.得到简单的窗口风格.

在CMianFrame中添加PreCreateWindow的代码:

   BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if( !CFrameWnd::PreCreateWindow(cs) )
  return FALSE;

 cs.cx =500;
 cs.cy =400;
 cs.lpszName =_T("OpenGL 框架程序");
 cs.style &=~FWS_ADDTOTITLE;//不把标题加到标题栏
 return TRUE;
}

3.添加OpenGL支持:

在CGLFrameView.h中添加头文件如下:

#include "gl\gl.h"
#include "gl\glu.h"
#include "gl\glaux.h"

在工程->设置->Project Settings对话框话中选择Link选项卡,在对象模块库中加入glaux.lib  glu32.lib opengl32.lib .

(TIP:当然,你也可以选择工程->添加到工程->添加文件命令,弹出的Insert Files into Project对话框中,转换到VC98\lib目录下面,选中glaux.lib , glu32.lib, opengl32.lib 这几个文件,按下OK,把它们添加到项目文件.)

以下操作均在CGLFrameView中进行

4.给视图添加一个RC句柄和DC句柄,一个protected的变量

class CGLFrameView:public CView

{

protected:

   ...//其他变量

 HGLRC     m_hrc; 
 CClientDC    *m_pDC;

   ...//其他变量

}

5.给视图添加消息处理:

添加WM_CREATE,WM_DESTROY,WM_SIZE,WM_PAINT,WM_ERASEBKGND 这5个消息的处理函数.

6.修改CGFrameView的PreCreateWindow() 函数如下:

BOOL CGLFrameView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 cs.style |=WS_CLIPSIBLINGS|WS_CLIPCHILDREN; //不要画到兄弟窗口或子窗口
 return CView::PreCreateWindow(cs);
}

7.修改CGFrameView的OnCreate()函数如下:  ------------作用是设置RC的像素格式

int CGLFrameView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
//=================================== 
  int pixelformat;
  m_pDC = new CClientDC(this);//在客户区作图,获得设备描述表DC
 ASSERT(m_pDC != NULL);


 static PIXELFORMATDESCRIPTOR pfd =
 {
        sizeof(PIXELFORMATDESCRIPTOR),  //固定值
   1,                              //固定值
   PFD_DRAW_TO_WINDOW |            // support window
   PFD_SUPPORT_OPENGL |            // support OpenGL
   PFD_TYPE_RGBA,                  // RGBA模式,不用调色板
   16,                             //程序在16位色彩下运行

0, 0, 0, 0, 0, 0,               // color bits ignored

   0,                              // no alpha buffer
   0,                              // shift bit ignored
   0,                              // no accumulation buffer
   0, 0, 0, 0,                     // accum bits ignored
   32,                             // 32-bit z-buffer
   0,                              // no stencil buffer
   0,                              // no auxiliary buffer
   PFD_MAIN_PLANE,                 // main layer
   0,                              // reserved
   0, 0, 0                         // layer masks ignored
    };
  
 if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 ) //测试硬件是否支持该pdf
    {
        MessageBox("在该DC上找不到与PFD接近的位图结构");
        return -1;
    }
 
 if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)//测试硬件是否支持该pdf
    {
        MessageBox("无法在该DC上设置位图结构");
        return -1;
    }

  m_hrc = wglCreateContext(m_pDC->GetSafeHdc());//将RC与DC联系起来
    wglMakeCurrent(m_pDC->GetSafeHdc(), m_hrc);
 
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);

 return 0; //OpenGL窗口构造成功

}
8.修改CGFrameView的OnDestroy()函数如下:

void CGLFrameView::OnDestroy() 
{
 CView::OnDestroy();
 
 // TODO: Add your message handler code here
 if(wglGetCurrentContext()!=NULL) //释放RC以及DC
  ::wglMakeCurrent(NULL,  NULL);
 if (m_hrc)
        ::wglDeleteContext(m_hrc);
 if (m_pDC)
        delete m_pDC;}

9.修改CGFrameView的OnSize()函数如下:

void CGLFrameView::OnSize(UINT nType, int cx, int cy) 
{
 CView::OnSize(nType, cx, cy);

if(cy > 0)
    {    
        glViewport(0, 0, cx, cy);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
  if (cx <= cy)
    glOrtho(-3.0,3.0,-3.0 * (GLfloat)cx/(GLfloat)cy,
 3.0 * (GLfloat)cx/(GLfloat)cy,-3.0,3.0);
  else
   glOrtho(-3.0,3.0,-3.0 * (GLfloat)cy/(GLfloat)cx,
   3.0 * (GLfloat)cy/(GLfloat)cx,-3.0,3.0);
  glMatrixMode(GL_MODELVIEW);
  } 
}

10.修改CGFrameView的OnPaint()函数如下

void CGLFrameView::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 GLfloat light_position[]={2.0f,0.0f,4.0f,0.0f};

 // TODO: Add your message handler code here
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  glTranslatef(0.0f, 0.0f, -2.0f);
 glLightfv(GL_LIGHT0,GL_POSITION,light_position);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
 glDepthFunc(GL_LESS);
 glEnable(GL_DEPTH_TEST);
 auxSolidSphere(1.0);
  glPopMatrix();
  glFinish();
 // Do not call CView::OnPaint() for painting messages
}

11.修改CGFrameView的OnEraseBkgnd()函数如下

BOOL CGLFrameView::OnEraseBkgnd(CDC* pDC) 
{
 // TODO: Add your message handler code here and/or call default
 return TRUE; //消除屏幕闪烁
 //return CView::OnEraseBkgnd(pDC);
}

以上是用OpenGL编程所必须做好的基本工作^_*,希望对大家有帮助!


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang15061955806/article/details/49073731

MFC 中配置OpenGL环境

MFC为编写Windows应用程序提供了极大的方便,程序员在编写Windows应用程序时,只需要几步就可以把一个程序的框架建立起来.该类极大的提高了编程者的开发效率,是个具有极大实用价值的工具. ...
  • xiaoge132
  • xiaoge132
  • 2016-03-09 09:45:49
  • 2914

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架                                                             ...
  • sinat_24206709
  • sinat_24206709
  • 2016-03-09 15:40:58
  • 1740

直接在MFC的对话框上利用OpenGL绘制图形

借鉴前人的经验,如链接http://www.cnblogs.com/phinecos/archive/2007/07/28/834916.html介绍了如何利用MFC的单文档来使用OpenGL(本文也...
  • hurricanecqj
  • hurricanecqj
  • 2015-05-01 15:20:46
  • 1947

VS2012 +MFC+ OPenGL环境搭建

这里以MFC单文档程序为例。框架的代码是基于NEHE的OPenGL教程的,应该放在负责视图的View.cpp中,笔者的项目名叫迷宫,故类名为C迷宫View,下面是主要步骤: 一. 在MFC中的View...
  • hf19931101
  • hf19931101
  • 2015-12-23 19:48:00
  • 1287

VS 2012环境下使用MFC进行OpenGL编程

VS 2012下使用MFC+OpenGL基本步骤 引子:以前一直惧怕MFC感觉它是一个非常复杂的东西,更不用说去用它来和OpenGL结合了,以前是一直羡慕别人用MFC创建一个窗口进行OpenGL绘图...
  • bbppbb
  • bbppbb
  • 2014-04-22 21:11:59
  • 7112

如何在VC++中用MFC进行OpenGL编程

  • 2017年09月07日 12:15
  • 262KB
  • 下载

VS2013用MFC制作包含菜单的OpenGL程序

打开VS2013新建项目 MFC程序:命名为:MFCOpenGLDemo 单击确定 下一步建一个基于对话框的程序 单击完成:...
  • Tan_HandSome
  • Tan_HandSome
  • 2015-08-01 09:42:23
  • 1844

MFC下OpenGL绘图框架

MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的。 2, 添加链接库。这...
  • u012953777
  • u012953777
  • 2017-03-20 19:52:12
  • 160

基于MFC的OpenGL绘图

一、简介     GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令...
  • linyijiong
  • linyijiong
  • 2016-12-22 22:00:34
  • 315

基于OpenGL显示平台功能开发-MFC框架篇

基于OpenGL显示平台功能开发-MFC框架篇简介关于OpenGL MFC应用程序框架的搭建,大家可以在网上找到很多相关的历程。而且按照历程的步骤,基本上可以很顺利地搭建出来。为了更能充分的帮助读者了...
  • junbincc02
  • junbincc02
  • 2016-10-25 08:09:13
  • 313
收藏助手
不良信息举报
您举报文章:MFC搭建OpenGL框架示例
举报原因:
原因补充:

(最多只允许输入30个字)