VWRPLC32 Replacing a View in a CMDIChildWnd Window

ID: Q141499


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), used with:
    • Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1, 4.2, 5.0, 6.0

This is the 32-bit version of this sample.

SUMMARY

The VWRPLC32 sample demonstrates how, in a Multidocument Interface (MDI) application, a programmer can write a ReplaceView() member function for a CMDIChildWnd-derived class.

NOTE: The following samples, which also replace various views, exist:

SPLIT32 (SDI)
COLLECT (MDI)
ENROLL (SDI)
VSWAP32 (SDI)
The following files are available for download from the Microsoft Download Center. Click the file names below to download the files:


Vwrplc32.exe

For more information about how to download files from the Microsoft Download Center, please visit the Download Center at the following Web address
http://www.microsoft.com/downloads/search.asp
and then click How to use the Microsoft Download Center.

NOTE: Use the -d option when running VWRPLC32.EXE to decompress the file and re-create the proper directory structure.


MORE INFORMATION

The core of the sample can be found in FRAME.CPP. You will see the following function:


      BOOL CFrame::ReplaceView(CRuntimeClass * pViewClass)
      {
             CCreateContext context;
             CView * pCurrentView;

             // If no active view for the frame, return FALSE because
             // thisfunction retrieves the current document from the active
             // view.
             if ((pCurrentView=GetActiveView())==NULL)
                  return FALSE;

             // If we're already displaying this kind of view, no need
             // to go further.
             if ((pCurrentView->IsKindOf(pViewClass))==TRUE)
                  return TRUE;

             // Get pointer to CDocument object so that it can be used
             // in the creation process of the new view.
             CDocument * pDoc= pCurrentView->GetDocument();

             // Set flag so that document will not be deleted when
             // view is destroyed.
             BOOL bAutoDelete=pDoc->m_bAutoDelete;
             pDoc->m_bAutoDelete=FALSE;
             // Delete existing view
             pCurrentView->DestroyWindow();
             // restore flag
             pDoc->m_bAutoDelete=bAutoDelete;

             // Create new view and redraw.
             context.m_pNewViewClass=pViewClass;
             context.m_pCurrentDoc=pDoc;
             context.m_pNewDocTemplate=NULL;
             context.m_pLastView=NULL;
             context.m_pCurrentFrame=this;

             CView * pNewView = (CView *) pViewClass->CreateObject();

             if (pNewView == NULL)
             {
                  TRACE1("Warning: Dynamic create of view type %Fs
                                   failed\n", pViewClass->m_lpszClassName);
                  return FALSE;
             }

             if (!pNewView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
                          CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST,
                          &context))
             {
                  TRACE0("Warning: couldn't create view for frame\n");
                  return FALSE; // Programmer can assume FALSE return value
                                // from this function means that there
                                // isn't a view.
             }


             // WM_INITIALUPDATE is define in AFXPRIV.H.
             pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);

             RecalcLayout();

             pNewView->UpdateWindow();

             SetActiveView(pNewView);

             return TRUE;
      } 
The function receives a pointer to CRuntimeClass object for the new view that is desired. It destroys the old view and replaces it with a new view of the same CDocument. When DestroyWindow() is called for the old view, this causes a "delete this" in the CView::PostNcDestroy() function. Also, the CView::~CView destructor calls CView::RemoveView(), which removes the view from the document's view list.


REFERENCES

For additional information, please see the following article in the Microsoft Knowledge Base:

Q102829 Replacing a View in a CMDIChildWnd Window

Additional query words: MDI

Keywords : kbcode kbfile kbsample kbDocView kbMFC kbVC kbVC400 kbVC410 kbVC420 kbVC500 kbVC600
Version : winnt:4.0,4.1,4.2,5.0,6.0
Platform : winnt
Issue type :


Last Reviewed: December 15, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.