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

来源:互联网 发布:豚鼠实验 知乎 编辑:程序博客网 时间:2024/06/03 17:57

单文档多视图切换的解决办法
      
 由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:
 单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:
分栏多视图切换:      
 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; 
 } 
          无分栏多视图切换
Code:
 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,切换视图的方法为:
      
Code:
 //获得主窗口指针 
 CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd(); 
 //切换视图 
 pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView)); 
         OK,这样就好了,希望以上内容与你有所帮助,Good luck!

 

原创粉丝点击