Figure 5: Class COpenGLView

// File OGLView.h

class COpenGLView : public CView
{
    COpenGLCtrl & m_OpenGLCtrl; // The 3D control

 public:

    // ClassWizard generated virtual function overrides
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    virtual BOOL
    OnCmdMsg(UINT nID, int nCode, void* pExtra,
         AFX_CMDHANDLERINFO* pHandlerInfo);

 protected:  

    // Must pass COpenGLCtrl to constructor
    COpenGLView(COpenGLCtrl & OpenGLCtrl);
      
    // Message Map functions
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);

    //... Message map ...
};

// File OGLView.cpp

#include "stdafx.h"
#include "OGLView.h"
#include "OGLCtrl.h"

COpenGLView::COpenGLView(COpenGLCtrl & OpenGLCtrl)
            :m_OpenGLCtrl(OpenGLCtrl) // Pass OpenGLCtrl to view
{
}

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

void COpenGLView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy);
    // Fill entire window with OpenGLCtrl
    if (cx && cy && m_OpenGLCtrl.m_hWnd)
          m_OpenGLCtrl.MoveWindow(0,0,cx,cy,TRUE);
}

BOOL
COpenGLView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
    AFX_CMDHANDLERINFO* pHandlerInfo) 
{
    // Let OpenGL control handle command messages first
    if (m_OpenGLCtrl.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;
    else
        return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

int COpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    CRect Rect;
    GetClientRect(&Rect);

    // Create the OpenGL control
    if(!m_OpenGLCtrl.Create("MyOpenGL","",
         WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
           Rect,this,1,NULL))
    {
      TRACE0("Failed creating COpenGLCtrl window in COpenGLView\n");
      return -1;
    }
    
    return 0;
}
//End of File