Microsoft KB Archive/127071

From BetaArchive Wiki

MFCOGL a Generic MFC OpenGL Code Sample

Q127071



The information in this article applies to:


  • Microsoft Win32 Application Programming Interface (API), used with:
    • Microsoft Windows NT Server versions 3.5, 3.51
    • Microsoft Windows NT Workstation versions 3.5, 3.51
    • Microsoft Windows 95
    • Microsoft Visual C++, versions 2.0, 2.1
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Professional





SUMMARY

Microsoft Windows NT's OpenGL can be used with the Microsoft Foundation Class (MFC) library. This article gives you the steps to follow to enable MFC applications to use OpenGL.

The companion sample (MFCOGL) is a generic sample that demonstrates using OpenGL with MFC.



MORE INFORMATION

The following file is available for download from the Microsoft Download Center:


Mfcogl.exe

For additional information about how to download Microsoft Support files, click the article number below to view the article in the Microsoft Knowledge Base:

Q119591 How to Obtain Microsoft Support Files from Online Services

Microsoft used the most current virus detection software available on the date of posting to scan this file for viruses. Once posted, the file is housed on secure servers that prevent any unauthorized changes to the file.




Step-by-Step Example to Use OpenGL in MFC Application

  1. Include the necessary header files to use OpenGL including: - "gl\gl.h" for all core OpenGL library functions. These functions have the "gl" prefix such as glBegin(). - "gl\glu.h" for all OpenGL utility library functions. These functions have the "glu" prefix such as gluLookAt(). - "gl\glaux.h" for all Windows NT OpenGL auxiliary library functions. These functions have the "aux" prefix such as auxSphere(). You don't need to add a header file for functions with the "wgl" prefix.
  2. Add necessary library modules to the link project settings. These library modules include OPENGL32.LIB, GLU32.LIB, and GLAUX.LIB.
  3. Add implementations for OnPaletteChanged() and OnQueryNewPalette() in CMainFrame class for palette-aware applications.

       void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)
       {
           CFrameWnd::OnPaletteChanged(pFocusWnd);
    
           if (pFocusWnd != this)
               OnQueryNewPalette();
    
       }
    
       BOOL CMainFrame::OnQueryNewPalette()
       {
           WORD   i;
           CPalette   *pOldPal;
           CMfcOglView *pView = (CMfcOglView *)GetActiveView();
           CClientDC   dc(pView);
    
    
           pOldPal = dc.SelectPalette(&pView->m_cPalette, FALSE);
           i = dc.RealizePalette();
           dc.SelectPalette(pOldPal, FALSE);
    
           if (i > 0)
               InvalidateRect(NULL);
    
           return CFrameWnd::OnQueryNewPalette();
       } 
  4. Use the one or more of the following classes derived from CWnd, including view classes, that will use OpenGL for rendering onto: - Implement PreCreateWindow() and add WS_CLIPSIBLINGS and WS_CLIPCHILDREN to the windows styles:

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

    - Implement OnCreate() to initialize a rendering context and make it current. Also, initialize any OpenGL states here:

       int CMfcOglView::OnCreate(LPCREATESTRUCT lpCreateStruct)
       {
           if (CView::OnCreate(lpCreateStruct) == -1)
               return -1;
    
           Init(); // initialize OpenGL
    
           return 0;
       } 

    - Implement OnSize() if the window is sizeable:

       void CMfcOglView::OnSize(UINT nType, int cx, int cy)
       {
           CView::OnSize(nType, cx, cy);
    
           if (cy > 0)
           {
               glViewport(0, 0, cx, cy);
    
               if ((m_oldRect.right > cx) || (m_oldRect.bottom > cy))
                   RedrawWindow();
    
               m_oldRect.right = cx;
               m_oldRect.bottom = cy;
    
               glMatrixMode(GL_PROJECTION);
               glLoadIdentity();
               gluPerspective(45.0f, (GLdouble)cx / cy, 3.0f, 7.0f);
               glMatrixMode(GL_MODELVIEW);
           }
       } 

    - Implement OpenGL rendering code. This can be done in OnDraw() or other application-specific places such as OnTimer(). - Implement clean-up code, which is typically done in OnDestroy():

       void CMfcOglView::OnDestroy()
       {
           HGLRC   hrc;
    
           if (m_nTimerID)
               KillTimer(m_nTimerID);
    
           hrc = ::wglGetCurrentContext();
    
           ::wglMakeCurrent(NULL,  NULL);
    
           if (hrc)
            ::wglDeleteContext(hrc);
    
           CPalette    palDefault;
    
           // Select our palette out of the dc
           palDefault.CreateStockObject(DEFAULT_PALETTE);
           m_pDC->SelectPalette(&palDefault, FALSE);
    
           if (m_pDC)
               delete m_pDC;
    
          CView::OnDestroy();
       }
     

Additional query words: graphics kbfile

Keywords : kbfile kbsample kbOSWinNT350 kbOSWinNT351 kbOSWinNT400 kbOSWin2000 kbSDKWin32 kbOSWin95 kbOSWin98
Issue type : kbinfo
Technology : kbAudDeveloper kbWin32sSearch kbWin32API


Last Reviewed: May 5, 2001
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.