VC单文档切分动态更换多视图代码分析

转载 2004年10月18日 10:48:00

VC单文档切分动态更换多视图代码分析
汤米 @ 2004-09-21 14:39

     最近iMaker2000的界面设计所用的是Doc/View结构,涉及到Single Document的多视图带切分的切换。呵呵,光是述说都有点拗口了。VC做界面的确是麻烦啊,不过做好了我相信要比VB或者DELPHI要好,灵活度也会更好。不过就工程角度来说,VC做界面学学也就行了,如果要大规模的做,还是简单快捷的工具比较好。
     在网上找了很久相关的代码,最后终于在CodeGure上面找到了一个实现了相应功能的Project。一看时间,晕!98年的,算了,能实现功能就行了。
     建立View的过程就不多说了,这里主要说说怎么样切换的。
     不带切分的切换比较普遍了,VC技术内幕就有一个详细的代码,我待会会把代码也一起贴出来。
     带切分的主要的函数有2个,一个是建立时候的函数,一个是切换的函数,两个基本上很类似,这里分析一下切换的函数:
void CMainFrame::OnSwitchView1()
{
// TODO: Add your command handler code here
CRect cr;
GetClientRect(&cr);//取得客户区的显示区域
CSize paneSize1(3*cr.Width()/4, cr.Height());//设定新view大小
CCreateContext Context;//声明视图文档联系结构并设定其内容
Context.m_pNewViewClass=RUNTIME_CLASS(CSwitchView1);
Context.m_pCurrentDoc=((CSwitchApp*)AfxGetApp())->m_pDoc;
Context.m_pCurrentFrame=this;
Context.m_pNewDocTemplate=Context.m_pCurrentDoc->GetDocTemplate();
Context.m_pLastView=(CView*)m_wndSplitter.GetPane(0,0);
m_wndSplitter.DeleteView(0, 1);//删除第1行第2列的View
m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CSwitchView1),paneSize1, &Context);//动态创建View1
CSwitchView1 *pView=(CSwitchView1*)m_wndSplitter.GetPane(0,1);//得到切分窗口的指针
pView->GetParentFrame()->RecalcLayout();//重绘主窗口
m_wndSplitter.RecalcLayout();//重绘分隔条窗口
pView->OnInitialUpdate();//估计是一些初始化的操作
m_wndSplitter.SetActivePane(0,1);//激活新的分隔区域
}

不带切分的代码如下:
void CMainFrame::SwitchToView(int nForm)
{
//CDocument* pDoc = GetActiveDocument();
   CView *pOldActiveView=GetActiveView();             //保存旧视图
   CView *pNewActiveView=(CView*)GetDlgItem(nForm);   //取得新视图
   if(pNewActiveView==NULL)
   {
       switch(nForm)
       //这些ID是对话框的标志符,但也可以用其他的标志
       {
       case IDD_DIALOG1 :
           pNewActiveView=(CView*)new TForm;
           break;
       case IDD_FORMVIEW :
           pNewActiveView=(CView*)new TForm2;
           break;
       }
       CCreateContext context;   //将文挡和视图相连
       context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
           CFrameWnd::rectDefault, this, nForm, &context);


       pNewActiveView->OnInitialUpdate();
   }
   SetActiveView(pNewActiveView);        //改变活动的视图
   pNewActiveView->ShowWindow(SW_SHOW);  //显示新的视图
   pOldActiveView->ShowWindow(SW_HIDE);  //隐藏旧的视图

   if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(TForm))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG1);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(TForm2))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW);

   pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
   
   delete pOldActiveView;   //删除旧视图

RecalcLayout();          //调整框架窗口
}

比对一下可以看出,带切分的主要是通过m_wndSplitter这样一个成员进行操作,而不带切分的则是直接对整个View进行操作。(因为没有m_wndSplitter啊,呵呵。)

补充一下:刚刚调试了一下代码,有点波折,不过还是顺利通过了,其实代码可以简化很多。
void CMainFrame::OnSwitchView1()
{
m_wndSplitter.DeleteView(1, 0);
m_wndSplitter.CreateView(1, 0,
RUNTIME_CLASS(TForm2),
CSize(0, 0),
NULL);
m_wndSplitter.RecalcLayout();
}
当然,上面这个代码只涉及到了界面的切换,具体的程序中的应用很可能和文档有关,而且需要精确一点的控制,就需要看第一个函数了。注意我的View是纵向的2个,所以参数是1,0。

VC单文档切分动态更换

网事如风拒绝浮躁,记录技术人生中的点滴,希望能和偶然来到这里的你共同进步。 2004 十一月> >>日一二三四五六12345678910...
  • xu123
  • xu123
  • 2004年11月26日 11:33
  • 1367

VC小技巧(6)-----单文档多视图实现视图间的切换

在单一文档结构下,可以有多个视图存在,以下代码实现了视图(CFormView为例)间的切换,使用户在一个时间只能看到一个视图,并且能够切换到自己想要的视图。要想看到自己想要的视图,只需为以下函数传递相...
  • happyness44
  • happyness44
  • 2006年10月10日 16:17
  • 3175

单文档多视图切换方法

摘要:本文通过一个程序实例描述了在VC 6.0(vc2008可行)下如何在单文档程序中通过菜单动态控制多  个窗体的切换。     一、 引言     我们在编制程序中根据需求的不同会在...
  • foreverhuylee
  • foreverhuylee
  • 2014年10月12日 21:09
  • 5402

详细讲解如何在MFC单/多文档中创建多视图(具体代码)

【转】MFC 多文档  2010-01-11 17:23 如何在MFC单文档中创建多视图 基本步骤如下: 1.首先创建一个MFC单文档应用程序。 2.添加4个MFC类...
  • u014371234
  • u014371234
  • 2014年07月29日 11:28
  • 2799

单文档多视图的实现方法

本文利用 CMFCTabCtrl 实现多视图的选项卡式显示,程序截图如下: 第一步:新建两个对话框,并分别为其添加类 CFirstDlg、CSecondDlg...
  • zhugefei
  • zhugefei
  • 2012年03月21日 11:54
  • 2883

VC单文档多视图工程中,在任何地方访问某一指定视图类的方法

此处讨论的是单文档、多视图的VC工程。我们知道,在多视图工程中,要获取某一个指定视图类的指针(进而对它里面的控件等进行操作),我们可以通过这样的办法:从文档类取得视图类的指针:CDocument类提供...
  • learnhard
  • learnhard
  • 2007年08月29日 14:39
  • 3718

MFC单文档多视图的切换的3种实现

MFC单文档多视图的切换的3种实现 MFC建立程序工程向导时最后一步,选择CFormView作为View的基类。 假设工程名称为CMySingleDoc。 默认生成的View类名为:...
  • lx624909677
  • lx624909677
  • 2015年04月27日 09:48
  • 3147

MFC SDI单文档多视图的实现及自由切换(2种实现方式简析)

MFC SDI单文档多视图的实现及自由切换结合网上学习总结别人的例子,以及参考MSDN给出的例子,对SDI多视图的实现进行了一个简单的总结,以记录学习点滴.首先在H文件有如下声明:class CMul...
  • teleinfor
  • teleinfor
  • 2007年10月31日 10:44
  • 13536

单文档多视图

最后界面 1、创建单文档exe,支持切分窗口。 2、新建对话框资源 ID为IDD_TREEVIEW,Style=CHILD,BORDER=NONE, 删掉按...
  • wuan584974722
  • wuan584974722
  • 2014年06月10日 21:28
  • 4987

【交互】单文档多视图代码分析

一、基本原理 二、代码实现
  • sxyaxy
  • sxyaxy
  • 2013年11月04日 08:19
  • 934
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC单文档切分动态更换多视图代码分析
举报原因:
原因补充:

(最多只允许输入30个字)