/***************************************
功能:带分栏的切换视图的方法
*/
BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)
{
CCreateContext context;
BOOL bSetActive;
if ((this->m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
return FALSE;
//获取文档对象的指针,以便在创建新视图的过程中能够使用它
CDocument * pDoc= ((CView *)m_wndSplitter.GetPane(row,col))->GetDocument();
CView * pActiveView=this->GetActiveView();
if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))
bSetActive=TRUE;
else
bSetActive=FALSE;
pDoc->m_bAutoDelete=FALSE; //设置标志,这样当视图销毁时不会删除文档
((CView *) m_wndSplitter.GetPane(row,col))->DestroyWindow(); //删除存在的视图
pDoc->m_bAutoDelete=TRUE; //设回默认的标志
//创建新视图
context.m_pNewViewClass=pViewClass;
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
m_wndSplitter.CreateView(row,col,pViewClass,size, &context);
CView * pNewView= (CView *)m_wndSplitter.GetPane(row,col);
if (bSetActive==TRUE)
this->SetActiveView(pNewView);
m_wndSplitter.RecalcLayout(); //重新计算位置
pNewView->OnInitialUpdate(); //调用初始化函数
return TRUE;
}
/***************************************
功能:未分栏的切换视图的方法
*/
BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)
{
CCreateContext context;
CDocument *pDoc = GetActiveView()->GetDocument();
//销毁先前的视图窗口
pDoc->m_bAutoDelete = FALSE;
GetActiveView()->DestroyWindow();
pDoc->m_bAutoDelete = TRUE;
//创建新视图
context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;
CView *pNewView = (CView *)this->CreateView(&context);
//设置新视图为活动状态
this->SetActiveView(pNewView);
RecalcLayout();
//初始化新视图
pNewView->OnInitialUpdate();
return TRUE;
}
注意:切换视图时只能是view的派生类 不能是Cdialog或其他的类