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

2016-02-19 19:03 40 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享VC单文档切分动态更换多视图代码分析,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

    最近iMaker2000的界面设计所用的是Doc/View结构,涉及到Single Document的多视图带切分的切换。呵呵,光是述说都有点拗口了。VC做界面的确是麻烦啊,不过做好了我相信要比VB或者DELPHI要好,灵活度也会更好。不过就工程角度来说,VC做界面学学也就行了,如果要大规模的做,还是简单快捷的工具比较好。

     在网上找了很久相关的代码,最后终于在CodeGure上面找到了一个实现了相应功能的Project。一看时间,晕!98年的,算了,能实现功能就行了。

     建立View的过程就不多说了,这里主要说说怎么样切换的。

     不带切分的切换比较普遍了,VC技术内幕就有一个详细的代码,我待会会把代码也一起贴出来。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

     带切分的主要的函数有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);//激活新的分隔区域
}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

不带切分的代码如下:
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。

来源:http://www.tulaoshi.com/n/20160219/1619923.html

延伸阅读
标签: Web开发
第一个:  Untitled Document [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]   第二个: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
看过徐景周写过的一篇“程序界面多模式显示的实现”,在一个应用程序中使程序拥有多种显示模式,但是这个界面是由SDI的MFC文档视图结构实现,但是使用的代码在MDI的多文档/视图中不能实现,通过MSDN我找到了一些实现 MDI 的多模式实现方法,不敢独享,与大家分享 。 利用SDI和MDI实现这种多模式的显示的应用程序,第一步首先要实现的...
m_ReUrl.Format("javascript:CategHandle('%d','%s','%d','yes')",                 g_nGroupIndex + 1,dlg.m_vFileGroup[g_nGroupIndex].strGroup,dlg.m_vFileGroup.size());     CComPtrIDispatch ppDisp = NULL; ...
   摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给...
因为connection对象仅仅跟host对象相关,且处理一个套接字,所以其数据成员仅有:private Host _host; //指向宿主对象 private Socket _socket; //当前套接字我们知道host调用且仅了conn.ProcessOneRequest();方法,所以我们首先要找到此方法(coneetion很多方法,我们先看看主要的): public void ProcessOneRequest() { // wait for at leas...

经验教程

76

收藏

53
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部