整理在网上找到的资料
视图切换方式,使用SHOW/HIDE方式
CSplitterWndExtension that Allows Switching Views in Any Pane
在pane的隐藏/显示
HideCurrentView(nRow,nCol)
{
CWnd *pView = GetCurrentView(pane.row,pane.col);
pView->SetDlgCtrlID(0);
pView->ShowWindow(SW_HIDE);
}
CreateView(nRow,nCol, pViewClass, CSize(10,10), pContext);
SetCurrentView(nRow,nCol, newViewID)
{
CWnd *pView = GetView( viewID);
pView->SetDlgCtrlID(IdFromRowCol(pane.row,pane.col));
pView->ShowWindow(SW_SHOW);
}
MultiSplitterWnd
http://www.cherea.de/bitbucket/multisplitwnd/multisplitwnd.html
对上面的方法扩展
视图切换方式,使用CREATE/DESTROY方式
Replacing a viewin a doc-view application
BOOLCMainFrame::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(); //重新计算位置
// m_wndSplitter.GetPane(row,col)->SendMessage(WM_PAINT);
return TRUE;
}
上面的代码不记得在那里下
本文介绍了两种视图切换方法:一种是通过隐藏和显示视图来实现;另一种是通过创建和销毁视图的方式进行切换。提供了具体的实现代码示例。
407

被折叠的 条评论
为什么被折叠?



