CsplitterWnd 视图切换方式( 整理在网上找到的资料)

本文介绍了两种视图切换方法:一种是通过隐藏和显示视图来实现;另一种是通过创建和销毁视图的方式进行切换。提供了具体的实现代码示例。

 整理在网上找到的资料

视图切换方式,使用SHOW/HIDE方式

CSplitterWndExtension that Allows Switching Views in Any Pane

http://www.codeguru.com/cpp/w-d/splitter/article.php/c1529/CSplitterWnd-Extension-that-Allows-Switching-Views-in-Any-Pane.htm

 

在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

http://www.codeguru.com/cpp/w-d/doc_view/viewmanagement/article.php/c3321/Replacing-a-view-in-a-docview-application.htm

 

 

 

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;

}

 

上面的代码不记得在那里下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值