FILE: How to Replace a View in a CMDIChildWnd WindowLast reviewed: July 31, 1997Article ID: Q102829 |
The information in this article applies to:
There is an equivalent VC4.0 (32-bit) sample available under the name of VWRPLC32.
SUMMARYThe VWRPLC sample demonstrates how a programmer might write a ReplaceView() member function for a CMDIChildWnd-derived class. Download VWRPLC.EXE, a self-extracting file, from the Microsoft Software Library (MSL) on the following services: The following file is available for download from the Microsoft Software Library:
~ Vwrplc.exe (size: 36685 bytes)For more information about downloading files from the Microsoft Software Library, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q119591 TITLE : How to Obtain Microsoft Support Files from Online ServicesNOTE: Use the -d option when running VWRPLC.EXE to decompress the file and re-create the proper directory structure.
MORE INFORMATIONThe 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 this // function retrieves the current document from the active view. if ((pCurrentView=GetActiveView())==NULL) return FALSE; // If you'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.
REFERENCESFor more information, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q141499 TITLE : SAMPLE: VWRPLC32, Replacing a View in a CMDIChildWnd Window Keywords : MfcDocView kbfile kbsample kbhowto Technology : kbmfc Version : 1.0 1.5 2.0 2.1 Platform : NT WINDOWS |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |