单文档多视图切换之带有分割窗格的视图切换

转自:http://hi.baidu.com/_huanstephen/item/6c76f9ec3c9a823f5a7cfb50

切换视图第二层就是带有分割窗格的视图切换,我们首先看一下切换前后




带有分割窗格的视图切换

分割窗格的视图切换,我觉得难点是不容易在有限区域进行视图切换。

1、首先分割窗格,这里我不多解释,详情看下面链接;

2、再给每个视图一个唯一的ID号;

m_splitter.CreateStatic(this,1,2);
 m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pContext);
 m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),pContext);
 CWnd *pWnd=m_splitter.GetPane(0,1);
 m_pViews[0]=(CView*)m_splitter.GetPane(0,1);
 pWnd->SetDlgCtrlID(IDD_FORM1);
 pWnd->ShowWindow(SW_HIDE);
 m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(100,100),pContext);
 pWnd=m_splitter.GetPane(0,1);
 m_pViews[1]=(CView*)m_splitter.GetPane(0,1);
 pWnd->SetDlgCtrlID(m_splitter.IdFromRowCol(0,1));
 pWnd->ShowWindow(SW_SHOW);
 RedrawWindow();
 return true;

注:我这里CreateView一个新视图,就覆盖掉前一个视图,最终显示的是最后一个视图,前面的视图只是隐藏起来,等到使用的时候显示出来就好了。返回值要覆盖返回到基类的语句return CFrameWndEx::OnCreateClient(lpcs, pContext);将这句话注解,然后return true;

3、在哪里激活切换功能自己设计,我使用的是菜单;

4、响应主要包括下面几个步骤:

   1、首先获得窗格中的当前视图;

   2、使用IsKindOf判断这个类是否是将要切换到的类;

   3、获得框架长宽和窗格长宽;

CView *pView=(CView*)m_splitter.GetPane(0,1);   //1
 m_bTest=pView->IsKindOf(RUNTIME_CLASS(CForm2));   //2
 CRect rcFrame,rcClient;   //3
 m_splitter.GetClientRect(&rcClient);
 GetClientRect(&rcFrame);

上面的全部是准备工作,下面才是真正的切换;

   4、删除原有视图

   5、创建当前视图

   6、调整框架

if(m_bTest)
 {
  m_splitter.DeleteView(0,1);
  m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcClient.Width(),rcFrame.Height()),NULL);
  m_splitter.RecalcLayout();
 }
 else
 {
  m_splitter.DeleteView(0,1);
  m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Width(),rcFrame.Height()),NULL);
  m_splitter.RecalcLayout();
 }

仔细一看,貌似这个还要比单纯视图切换还要简单一些,这也没办法,CSplitterWnd提供了这么一个便捷的方法。

 上面的方法有个缺陷就是没有和文档类关联,现在修正这个问题,我们可以自己创建一个CCreateContext结构体,设置一下m_pCurrentDoc这个参数与文档类关联,再把他替换掉NULL就好了。

例:

 CCreateContext Context;
 Context.m_pCurrentDoc=GetActiveDocument();
 m_Splitter1.DeleteView(1,0);
 m_Splitter1.CreateView(1,0,RUNTIME_CLASS(CSurveyCurvedForm),CSize(0,0),&Context);
 m_Splitter1.RecalcLayout();

posted @ 2014-05-20 18:43  何人之名  阅读(544)  评论(0)    收藏  举报