由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:
单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:
分栏多视图切换:
- 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;
- }
两种情况的原理一样,差别只在创建新视图后视图指针的获取。一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:
- //获得主窗口指针
- CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();
- //切换视图
- pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));
OK,这样就好了,希望以上内容与你有所帮助,Good luck!