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

GP3V1V

GP3V1V

2016-02-19 19:03

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

    最近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);  //隐藏旧的视图

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

   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啊,呵呵。)

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

补充一下:刚刚调试了一下代码,有点波折,不过还是顺利通过了,其实代码可以简化很多。
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。

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
VC单文档切分动态更换多视图代码分析

VC++ 6.0中实现三叉切分窗口与多视图现

编程语言 网络编程
VC++ 6.0中实现三叉切分窗口与多视图现

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

word文档使用框架切分文档

电脑应用
word文档使用框架切分文档

adobe dreamweaver教程代码视图

Dreamweaver 电脑应用
adobe dreamweaver教程代码视图

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何更换WPS文档界面?

电脑入门
如何更换WPS文档界面?

VC保存文件的参考代码

编程语言 网络编程
VC保存文件的参考代码

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

关于VC的编译模式

关于VC的编译模式

Win8程序无响应怎么办?

Win8程序无响应怎么办?
下拉加载更多内容 ↓