在MFC下使用OpenGL的一个简单的例子

原创 2002年03月25日 08:49:00

       最近开始准备做OpenGL方面的东西,万事开头难,真是体会颇深,简直就是寸步难行。有时候发各帖子到网上,不停地刷新,希望能有高手指点,可是,每次收获并不是太大。也许,每个程序员都有一个痛苦的过程,我当然不能例外了。不过,痛苦之后有收获才是最大的快乐。

       正因为这个原因,当我度过了自己的第一难关时,心里爽死了;不过,想到自己的痛苦经历,真是往事不堪回首;想必还会有人不断地开始学习OpenGL吧,希望我写出来的东西,能减轻他们的痛苦经历。

      在MFC下编OpenGL的程序,首先要设置环境:

      首先在XXView.h下,加入头文件

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

     然后再把下面的文件加入到自己的工程中。

          VC所在的盘:/Program Files/Microsoft Visual Studio/VC98/Lib/OPENGL32.LIB

           VC所在的盘:/Program Files/Microsoft Visual Studio/VC98/Lib/GLU32.LIB.LIB

           VC所在的盘:/Program Files/Microsoft Visual Studio/VC98/Lib/GLAUX.LIB.LIB

     可能有些你目前用不到,不过没有关系,以后再用就不用改了。

     下面是主要的四部分:

         4-1:

    void CMySunView::OnInitialUpdate()
{
 CView::OnInitialUpdate();
 //
 m_pDC = new CClientDC(this);
 m_hDC=m_pDC->GetSafeHdc();
 static PIXELFORMATDESCRIPTOR pfd =
 {
        sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW   |          // support window
          PFD_SUPPORT_OPENGL |          // support OpenGL
          PFD_DOUBLEBUFFER,             // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        24,                             // 24-bit color depth
        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
        16,                             // 16-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        0, 0, 0                         // layer masks ignored
    };
    int   m_PixelFormat;
    m_PixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
    ::SetPixelFormat(m_hDC, m_PixelFormat, &pfd);
 //
 m_hRC = ::wglCreateContext( m_hDC );
 wglMakeCurrent( m_hDC, m_hRC );

 
}

4-2:

void CMySunView::OnDraw(CDC* pDC)
{
 CMySunDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 //
 ::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 float size=100.0f;
 glLineWidth(3.0f);  // 
 // axis -- x
 glColor3f(1,0,0);
 glBegin(GL_LINES); 
 glVertex3f(-size,0,0);
 glVertex3f(size,0,0);
 glEnd();
 // axis -- y
 glColor3f(0,1,0);
 glBegin(GL_LINES); 
 glVertex3f(0,-size,0);
 glVertex3f(0,size,0);
 glEnd();
 // axis -- z
 glColor3f(0,0,1);
 glBegin(GL_LINES); 
 glVertex3f(0,0,-size);
 glVertex3f(0,0,size);
 glEnd();
 //
 glLineWidth(1.0f); // ssj 
 ::glFinish(); 
 SwapBuffers( m_hDC );
}

4-3

void CMySunView::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);
 //
 if ( 0 >= cx || 0 >= cy )
  return;
 ::glClearColor(0.0f, 0.0f, 0.0f, 255.0f);
 // specify the back of the buffer as clear depth
    ::glClearDepth(1.0f);
 // enable depth testing
    ::glEnable(GL_DEPTH_TEST);
 ::glViewport(0, 0, cx, cy); 
 ::glMatrixMode( GL_PROJECTION );
 ::glLoadIdentity();
 ::glOrtho( xOrg - xMax, xOrg + xMax, yOrg - yMax, yOrg + yMax,
  zOrg-zMax, zOrg + zMax);
 ::glRotatef( xrotate, 1.0f, 0.0f, 0.0f );
 ::glRotatef( yrotate, 0.0f, 1.0f, 0.0f );
 ::glRotatef( zrotate, 0.0f, 0.0f, 1.0f );
 ::glMatrixMode( GL_MODELVIEW); 
 ::glLoadIdentity();
 Invalidate();
 
}
4-4

BOOL CMySunView::OnEraseBkgnd(CDC* pDC)
{
      return true;
}

void CMySunView::OnDestroy()
{
 CView::OnDestroy();
 wglDeleteContext(m_hRC); 
 
}

  CMySunView::CMySunView()
{
  xrotate=45.0f;
  yrotate=0.0f;
  zrotate=-15.0f; 
  xOrg=0, xMax=42;
  yOrg=0, yMax=70;
  zOrg=0, zMax=40;

}

class CMySunView : public CView
{
..........

public:
 HGLRC m_hRC;
 HDC   m_hDC;
 CDC* m_pDC;
 int   width,height;
 float xrotate;
 float yrotate;
 float zrotate; 
 float xOrg, xMax;
 float yOrg, yMax;
 float zOrg, zMax;

.........

}

        上面是主要的步骤,当然,其他个性化的东西都可以添加上去,这是最小化的最基本的东西,可能也会有不妥地地方,不过已经能看到东西了。

        我想程序这么简单就不要做太多的解释了,有兴趣的话,继续探讨。

基于MFC完整的OpenGL框架步骤

1. 新建一个MEC单文档应用程序,如下各图所示, 2. 更改头文件,双击WelecomView.h,在程序前面加上以下两个头文件(W...
  • u013232740
  • u013232740
  • 2015年01月28日 14:52
  • 1431

OpenGL在MFC中的使用总结(一)——基本框架

项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,而且是在MFC中的ActiveX中使用,再而且鉴于他们程序主框架的设定,常规的方法还不一定能实现。所以还是查过不少资料,在此一一总结...
  • lyh03601
  • lyh03601
  • 2014年08月21日 16:10
  • 3556

MFC的对话框中使用OpenGL绘图

我们在编写软件是总是会有自己的界面,当然利用C++就不得不和MFC打交道了,那么可视化界面通常就要用MFC的Dialog;OpenGL通常画图时会自己生成一个窗口,就如同OpenCV一样,但现在我想O...
  • u010258235
  • u010258235
  • 2014年04月16日 18:27
  • 1123

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

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

Opengl与MFC结合显示图像

Opengl与MFC结合显示图像。下面是总结的一个类: //头文件 #if !defined(AFX_OPENGL_H__4D4A8C3F_A907_4A63_B205_B839E456A...
  • xbeinonlinkejidaxue
  • xbeinonlinkejidaxue
  • 2014年11月06日 21:56
  • 1029

在对话框中dialog 创建简单opengl程序

前言:用opengl库在mfc 对话框程序中创建简单的opengl程序 开发环境:vs2010+opengl库  步骤: 1.用vs2010创建mfc dialog对话框程序 直接...
  • wangsky2
  • wangsky2
  • 2013年12月30日 12:43
  • 6828

基于MFC完整的OpenGL框架步骤

1. 新建一个MEC单文档应用程序,如下各图所示, 2. 更改头文件,双击WelecomView.h,在程序前面加上以下两个头文件(W...
  • u013232740
  • u013232740
  • 2015年01月28日 14:52
  • 1431

OpenGL在MFC中的使用总结(二)——派生的OpenGL类

有些时候用到OpenGL需要每次进行配置,有点麻烦,可以直接基于CWND派生一个OpenGL类,在需要的时候直接用就可以了。下面附赠上这样一个类,其中删掉了我项目具体绘制的一些东西,如有错误不能用请联...
  • lyh03601
  • lyh03601
  • 2014年08月21日 16:27
  • 1326

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

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

MFC 中配置OpenGL环境

MFC为编写Windows应用程序提供了极大的方便,程序员在编写Windows应用程序时,只需要几步就可以把一个程序的框架建立起来.该类极大的提高了编程者的开发效率,是个具有极大实用价值的工具. ...
  • xiaoge132
  • xiaoge132
  • 2016年03月09日 09:45
  • 2447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在MFC下使用OpenGL的一个简单的例子
举报原因:
原因补充:

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