ITPub博客

首页 > 应用开发 > IT综合 > 在MFC下使用OpenGL的一个简单的例子 (转)

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

原创 IT综合 作者:gugu99 时间:2007-11-11 18:30:02 0 删除 编辑
在MFC下使用OpenGL的一个简单的例子 (转)[@more@]

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

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

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

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

  #include"glgl.h"
 #include"glglu.h"
 #include"glglaux.h"

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

  VC所在的盘:Program Filesmicrosoft Visual StudioVC98LibOPENGL32.LIB

  VC所在的盘:Program FilesMicrosoft Visual StudioVC98LibGLU32.LIB.LIB

  VC所在的盘:Program FilesMicrosoft Visual StudioVC98LibGLAUX.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;

.........

}

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

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-981764/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3122
  • 访问量
    2223712