OpenGL Programming for Windows MFC


1.Starting OpenGL

黄色は追加・編集
Yellow characters are addition and editing.


1.1 StdAfx.h に OpenGL の include を追加

    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glaux.h>      
include of OpenGL is added to StdAfx.h


1.2 プロジェクト->設定の link タブで、カテゴリ「一般」または 「インプット」のオブジェクト/ライブラリモジュールに OpenGL の Import Library 指定を追加。

  opengl32.lib glu32.lib glaux.lib

The Import Library designation of OpenGL is added to "object/library module" of the category "general" or "input" with the "link" tab of the "project->setup" menu.

1.3 XXXView.h に以下のメンバー変数追加

    CDC*    m_pDC ;     // Device Context 
    HGLRC   m_GLRC  ;   // OpenGL Rendering Context
This member variable addition to XXXView.h.


1.4 XXXView.cpp を編集

1.4.1 PreCreateWindow に以下の行を追加

BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs)
{

  cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN ;

  return CView::PreCreateWindow(cs);
}
The above line is added to PreCreateWindow.


1.4.2 OnDraw に以下の行を追加

void CXXXView::OnDraw(CDC* pDC)
{
    CXXXDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    DrawGL() ;                     // Drawing by OpenGL
    SwapBuffers(m_pDC->m_hDC) ;    // Double buffer

}
The above line is added to OnDraw.


1.4.3 Class Wizard により CXXXView の WM_CREAT - OnCreat を オーバライドし以下の行を追加

int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    m_pDC = new CClientDC(this) ;             // Get device context
    SetDCPixelFormat(m_pDC->m_hDC) ;          // Set OpenGL pixel format
    m_GLRC = wglCreateContext (m_pDC->m_hDC); // Create rendering context
    wglMakeCurrent (m_pDC->m_hDC, m_GLRC);    // Current context set
    InitGL() ;                                // Initalize OpenGL

    return 0;
}
Overrid WM_CREAT(OnCreat) of CXXXView by Class Wizard.
Then, add the above line.


1.4.4 Class Wizard により CXXXView の WM_DESTROY(OnDestroy) を オーバライドし以下の行を追加

void CXXXView::OnDestroy() 
{
    CView::OnDestroy();

    wglMakeCurrent (NULL, NULL); // free current context
    wglDeleteContext (m_GLRC);   // Delete rendering context
    delete m_pDC ;               // Release device context

}
Overrid WM_DESTROY(OnDestroy) of CXXXView by Class Wizard.
Then, add the above line.


1.5 The example of SetDCPixelFormat.

int SetDCPixelFormat (HDC hdc)
{

    static PIXELFORMATDESCRIPTOR pfd = {
        sizeof (PIXELFORMATDESCRIPTOR),             // Size of this structure
        1,                                          // Version number
        PFD_DRAW_TO_WINDOW |                        // Flags
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,                              // RGBA pixel values
        24,                                         // 24-bit color
        0, 0, 0, 0, 0, 0,                           // Don't care about these
        0, 0,                                       // No alpha buffer
        0, 0, 0, 0, 0,                              // No accumulation buffer
        32,                                         // 32-bit depth buffer
        0,                                          // No stencil buffer
        0,                                          // No auxiliary buffers
        PFD_MAIN_PLANE,                             // Layer type
        0,                                          // Reserved (must be 0)
        0, 0, 0                                     // No layer masks
    };

    int nPixelFormat;
    
    nPixelFormat = ChoosePixelFormat (hdc, &pfd);
    if (SetPixelFormat(hdc, nPixelFormat, &pfd) == FALSE) {
      // SetPixelFormat error
      return FALSE ;
    }

    if (DescribePixelFormat(hdc, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR),&pfd) == 0) {
      // DescribePixelFormat error
      return FALSE ;
    }

    if (pfd.dwFlags & PFD_NEED_PALETTE) {
        // Need palete !
    }
    return TRUE ;
}

1.6 InitGL , DrawGL


GLint InitGL(void)
{
    glClearColor(0.0f, 0.0f, 0.5f, 1.0f) ;	

    return (0) ;
}

GLint DrawGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;

    return(0) ;
}

1.7 Build and Execute

以上の後、ビルド及び実行した時に glClearColor で指定した色(この例では暗めの青)で ウインドウがクリアされれば OpenGL は動作している。

If window is cleared by dark blue, OpenGL is moving.


色が変わらない場合は OpenGL が動作していないので、特に OnCreat の部分や、OnDraw で SwapBuffers(シングルバッファ時は glFlush または glFinish)がコールされている事を 確認する事。


next