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