当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

VC++6.0中使用OpenGL

        ----要学习OpenGL 编程,希望读者具备基本的图形知识。本文使用基于Visual C ++消息驱动编程,对于没学过VC 的读者也有一定的帮助。我们的第一个程序将明建立一个视窗程序显示OpenGL 图形的最小需求。为成这一任务我们将分如下5 步来进行:

    ----要学习OpenGL 编程,希望读者具备基本的图形知识。本文使用基于Visual C ++消息驱动编程,对于没学过VC 的读者也有一定的帮助。我们的第一个程序将明建立一个视窗程序显示OpenGL 图形的最小需求。为成这一任务我们将分如下5 步来进行:

    ----1 设置窗口像素的格式;2 建立RC;3 使RC 设为当前;4 创建视口和矩阵模型;5 画一个立方体和一个茶壶。

    ----现在你可以打开你的Visual C ++,建立一个单文档的项目。首先我们在该项目中加进所有必需的OpenGL 文件和库,在菜单中选择Build Settings,然后点击LINK 按钮( 或者按Ctrl +Tab 键来移动到那儿)。在Object/Library 栏中键入Opengl32.lib glu32.lib glaux.lib, 并确定。打开文件stdafx.h 插入如下行:

            #include < gl\gl.h >
            #include < gl\glu.h >
            #include < gl\glaux.h >

    ----OpenGL 仅能在具有WS_CLIPCHILDREN 和WS_CLIPSIBLINGS 类型的窗口显示图形,我们需要编辑OnPreCreate 函数,指定一下窗口类型。

    BOOL COPView::PreCreateWindow(CREATESTRUCT &cs)
    {cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
    return CView::PreCreateWindow(cs);
    }

    ----下面我们要定义窗口的像素格式,这一点对建立RC 很重要。首先我们需要建立一个受保护的成员函数BOOL SetWindowPixelFormat(HDC hDC)。如下所示:

    BOOL COPView::SetWindowPixelFormat(HDC hDC)
    {
    PIXELFORMATDESCRIPTOR pixelDesc;
    pixelDesc.nSize   = sizeof(PIXELFORMATDESCRIP 
     TOR);
    pixelDesc.nVersion  = 1;
    pixelDesc.dwFlags   = PFD_DRAW_TO_WINDOW |
    PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL |
    PFD_SUPPORT_GDI |PFD_STEREO_DONTCARE;
    pixelDesc.iPixelType  = PFD_TYPE_RGBA;
    pixelDesc.cColorBits = 32;
    pixelDesc.cRedBits = 8;
    pixelDesc.cRedShift = 16;
    pixelDesc.cGreenBits = 8;
    pixelDesc.cGreenShift = 8;
    pixelDesc.cBlueBits = 8;
    pixelDesc.cBlueShift = 0;
    pixelDesc.cAlphaBits = 0;
    pixelDesc.cAlphaShift = 0;
    pixelDesc.cAccumBits= 64;
    pixelDesc.cAccumRedBits = 16;
    pixelDesc.cAccumGreenBits = 16;
    pixelDesc.cAccumBlueBits = 16;
    pixelDesc.cAccumAlphaBits= 0;
    pixelDesc.cDepthBits = 32;
    pixelDesc.cStencilBits= 8;
    pixelDesc.cAuxBuffers = 0;
    pixelDesc.iLayerType= PFD_MAIN_PLANE;
    pixelDesc.bReserved = 0;
    pixelDesc.dwLayerMask= 0;
    pixelDesc.dwVisibleMask= 0;
    pixelDesc.dwDamageMask= 0;
    m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
    if (m_GLPixelIndex==0) // Let's choose a default index.
     {
      m_GLPixelIndex = 1;
    if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof
    (PIXELFORMATDESCRIPTOR), &pixelDesc)==0)
     {
    return FALSE;
    }
    }
    if (SetPixelFormat( hDC, m_GLPixelIndex,
                               &pixelDesc)==FALSE)
      {
      return FALSE;
      }
      return TRUE;
    }

    ----加入一个成员变量到视类中:

    int m_GLPixelIndex; // protected

    ----最后,在ClassWizard 中加入函数OnCreate 来响应消息WM_CREATE,函数如下:

      int COPView::OnCreate
    (LPCREATESTRUCT lpCreateStruct)
    {
      if (CView::OnCreate(lpCreateStruct) == -1)
      return -1;
      HWND hWnd = GetSafeHwnd();
      HDC hDC = ::GetDC(hWnd);
      if (SetWindowPixelFormat(hDC)==FALSE)
       return 0;
      if (CreateViewGLContext(hDC)==FALSE)
                            return 0;
       return 0;
         }

    ----下面需要作的步骤就是建立RC,并置为当前RC。

    ----在视类中加入保护函数CreateViewGLContext(HDC hDC) 和变量HGLRC m_hGLContext:

    BOOL COPView::CreateViewGLContext(HDC hDC)
    {
    m_hGLContext = wglCreateContext(hDC);
      if (m_hGLContext == NULL)
      {
       return FALSE;
      }
      if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)
      {
       return FALSE;
       }
       return TRUE;
    }
        加入函数OnDestroy 来响应WM_DESTROY:
 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接