单文档多视图切换的解决办法

本文介绍了单文档界面中实现多视图切换的两种方法:分栏多视图切换和无分栏多视图切换,并提供了可重用的函数代码。通过这些函数,可以轻松地在不同的视图间进行切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:

        单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:

        分栏多视图切换:       

Code:
  1. BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)  
  2. {  
  3.     CCreateContext context;  
  4.     BOOL bSetActive;  
  5.   
  6.     if ((this->m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)  
  7.         return FALSE;  
  8.       
  9.     //获取文档对象的指针,以便在创建新视图的过程中能够使用它  
  10.     CDocument * pDoc= ((CView *)m_wndSplitter.GetPane(row,col))->GetDocument();  
  11.   
  12.     CView * pActiveView=this->GetActiveView();  
  13.     if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))  
  14.         bSetActive=TRUE;  
  15.     else  
  16.         bSetActive=FALSE;  
  17.       
  18.     pDoc->m_bAutoDelete=FALSE;    //设置标志,这样当视图销毁时不会删除文档  
  19.     ((CView *) m_wndSplitter.GetPane(row,col))->DestroyWindow();  //删除存在的视图  
  20.     pDoc->m_bAutoDelete=TRUE;  //设回默认的标志  
  21.       
  22.   
  23.     //创建新视图  
  24.     context.m_pNewViewClass=pViewClass;  
  25.     context.m_pCurrentDoc=pDoc;  
  26.     context.m_pNewDocTemplate=NULL;  
  27.     context.m_pLastView=NULL;  
  28.     context.m_pCurrentFrame=NULL;  
  29.     m_wndSplitter.CreateView(row,col,pViewClass,size, &context);  
  30.       
  31.   
  32.     CView * pNewView= (CView *)m_wndSplitter.GetPane(row,col);  
  33.       
  34.     if (bSetActive==TRUE)  
  35.         this->SetActiveView(pNewView);  
  36.       
  37.     m_wndSplitter.RecalcLayout();        //重新计算位置  
  38.     pNewView->OnInitialUpdate();         //调用初始化函数  
  39.     return TRUE;  
  40. }  

          无分栏多视图切换

Code:
  1. BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)  
  2. {  
  3.     CCreateContext context;  
  4.   
  5.     CDocument *pDoc = GetActiveView()->GetDocument();  
  6.   
  7.     //销毁先前的视图窗口  
  8.     pDoc->m_bAutoDelete = FALSE;  
  9.     GetActiveView()->DestroyWindow();  
  10.     pDoc->m_bAutoDelete = TRUE;  
  11.   
  12.     //创建新视图  
  13.     context.m_pNewViewClass = pViewClass;  
  14.     context.m_pCurrentDoc = pDoc;  
  15.     context.m_pNewDocTemplate = NULL;  
  16.     context.m_pLastView = NULL;  
  17.     context.m_pCurrentFrame = NULL;  
  18.     CView *pNewView = (CView *)this->CreateView(&context);  
  19.   
  20.     //设置新视图为活动状态  
  21.     this->SetActiveView(pNewView);  
  22.     RecalcLayout();  
  23.   
  24.     //初始化新视图  
  25.     pNewView->OnInitialUpdate();  
  26.   
  27.     return TRUE;  
  28.   
  29. }  

        两种情况的原理一样,差别只在创建新视图后视图指针的获取。一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:

       

Code:
  1. //获得主窗口指针  
  2. CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();  
  3. //切换视图  
  4. pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));  

         OK,这样就好了,希望以上内容与你有所帮助,Good luck!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值