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 :