VWRPLC32 Replacing a View in a CMDIChildWnd Window (141499)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Editions 4.2
    • Microsoft Visual C++, 32-bit Editions 5.0
    • Microsoft Visual C++, 32-bit Editions 6.0

This article was previously published under Q141499
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:

Visual C++ 6.0

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

119591 How to Obtain Microsoft Support Files from Online Services

Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.

Visual C++ .NET

Release Date: June 26, 2002

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

119591 How to Obtain Microsoft Support Files from Online Services

Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file. 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:

102829 Replacing a View in a CMDIChildWnd Window


Modification Type:MinorLast Reviewed:8/5/2004
Keywords:kbdownload kbcode kbDocView kbfile kbMDI kbSample KB141499