一般书中介绍的是使用CSplitterWnd来拆分窗口实现多视图,CSplitterWnd中的CreateClient可以保存其创建的pCreateContext指针,以便子视图共享Document。这我用一篇文章详细说明。CTabView建立多视图的好处在于简单的标签切换,可以让每个View的窗口都很大。下面说说如何操作:

在建立项目时,程序向导最后一步并未提供让View为CTabView类型,因此我们需要自己新建一个CTabView的子类。

在vc2008中,在项目菜单中“项目”->“添加类”,可以自动生成类,像vc6的话ClassWizard也可以自动添加。

修改WinApp中的InitInstance中的new CMultiDocTemplate(),修改其中的View类型为刚刚新建的CTabView子类。

    // 注册应用程序的文档模板。文档模板// 将用作文档、框架窗口和视图之间的连接
    CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_TestTabViewTYPE,RUNTIME_CLASS(CTestTabViewDoc),RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
        RUNTIME_CLASS(CMyTabView));if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);

修改完成后,可以看出TabView的形态已经出来了,不过里面没有子View。下面来添加子view。

一般子view也需要新建,继续使用自动新建类,可以建立CFormView、ClistView等等的视图来显示数据。

新建子view在CTabView的OnCreate函数中,在新建类中需要新建CCreateContext来将Doc给新的View。

int CMyTabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CTabView::OnCreate(lpCreateStruct) == -1)return -1;// TODO:  在此添加您专用的创建代码
    CCreateContext context;context.m_pNewViewClass = RUNTIME_CLASS(CView1);context.m_pCurrentDoc = GetDocument();AddView(RUNTIME_CLASS(CView1),"哈哈",100,&context);context.m_pNewViewClass = RUNTIME_CLASS(CEditView);AddView(RUNTIME_CLASS(CEditView),"呵呵",101,&context);return 0;
}

上述代码新建了2个视图,CCreateContext指定需要新建View,指定Doc为TabView的Doc,在AddView中的最后参数中将CCreateContext传入。

至此,子视图中可以使用GetDocument来得到在WinApp中CTestTabViewDoc的类实例指针,这些子视图共享了同一份Doc。

后续:

过了几天,我无意间发现AddView的代码,是自动将自己的Doc传给子tab,请看代码:

int CTabView::AddView(CRuntimeClass* pViewClass, const CString& strViewLabel, int iIndex /*= -1*/, CCreateContext* pContext/* = NULL*/)
{ASSERT_VALID(this);ENSURE(pViewClass != NULL);ENSURE(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));CView* pView = DYNAMIC_DOWNCAST(CView, pViewClass->CreateObject());ASSERT_VALID(pView);if (!pView->Create(NULL, _T(""), WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), &m_wndTabs, (UINT) -1, pContext)){TRACE1("CTabView:Failed to create view '%s'\n", pViewClass->m_lpszClassName);return -1;}CDocument* pDoc = GetDocument();if (pDoc != NULL){ASSERT_VALID(pDoc);BOOL bFound = FALSE;for (POSITION pos = pDoc->GetFirstViewPosition(); !bFound && pos != NULL;){if (pDoc->GetNextView(pos) == pView){bFound = TRUE;}}if (!bFound){pDoc->AddView(pView);}}m_wndTabs.InsertTab(pView, strViewLabel, iIndex);int nTabs = m_wndTabs.GetTabsNum();return nTabs - 1;
}

所以,只要AddView就可以,不再需要CCreateContext结构体作为参数,子tab就可以获得Doc指针了。

转载于:https://www.cnblogs.com/huty/p/8518679.html

【VS开发】使用CTabView分割多页卡窗口相关推荐

  1. Python OpenCV开发MR智能人脸识别打卡系统(三、工具模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  2. Android:ViewPager为页卡内视图组件添加事件

    在数据适配器PagerAdapter的初始化方法中添加按钮事件,这里是关键,首先判断当前的页卡编号.必须使用当前的view来获取按钮. @Overridepublic Object instantia ...

  3. 详细说明通过kettke对csv文件转换的操作步骤_如何将多页面pdf分割成一页一页的PDF文件...

    经常会有小伙伴问我,如何将多页面的PDF文件拆分成一个个的PDF文件?例如有5个页面的PDF文件,一次性拆分导出生成5个单页面的PDF文件? PDF文件是我们日常工作学习中经常要用到的,有时候PDF文 ...

  4. 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。

    参考自http://www.apkbus.com/android-86125-1-1.html 这篇文章技术含量一般,大家别见笑.源码我以测试,在底部可下载.    好了先上效果图: 以下是实现步骤: ...

  5. android viewpager 间隔,viewpager 系统兼容 clipChildren 页卡间距

    此效果在4.4以下有个bug,两边的会有遮盖,但是一滑动就没事了... 此时需要给viewpager设置onpagerchangedListener 刷新父布局invalidate viewpager ...

  6. python获取pdf页数_Python分割指定页数的pdf文件方法

    Python分割指定页数的pdf文件方法 如下所示: from PyPDF2 import PdfFileWriter, PdfFileReader # 开始页 start_page = 0 # 截止 ...

  7. Python OpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下链接 Python OpenCV开发MR智能人脸识别打卡系统(二.文件系统.数据实体模块设计) Python OpenCV开发MR智能人脸 ...

  8. Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  9. Android开发之百度地图定位打卡

    Android开发之百度地图定位打卡 一.效果图 二.下载百度地图SDK 三.代码实现 1.布局文件(activity_main) 2.布局文件(activity_map) 3.在res文件夹下新建m ...

最新文章

  1. BZOJ 3745: [Coci2015]Norma(分治)
  2. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟
  3. 十六进制表示_教资信息技术之:十进制(正数)转二进制、八进制、十六进制...
  4. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接...
  5. matlab 两点划线,matlab学习2-画线
  6. 【docker】宿主机安装kafka docker容器内clickhouse无法连接
  7. python免费全套教程-python入门免费教程看这些就够了
  8. layui admin 当前子页面 刷新 其他页面 layui 关闭 子弹窗
  9. Luogu4074[WC2013] 糖果公园
  10. 步进电机驱动器单片机控制电路
  11. 基于人脸识别录入 人脸图片识别 及测试的效果
  12. 用户与计算机的交互界面是什么,终于知道交互界面设计是什么
  13. Linux多线程pthread使用
  14. APP下载链接在微信被屏蔽了 无法打开的解决方案
  15. springboot+vue前后端分离项目(后台管理系统)
  16. 2017华为软件精英挑战赛解分析
  17. 数据压缩实验八:MPEG音频压缩编码
  18. 【前沿技术RPA】 一文了解UiPath 机器人企业框架 (REFramework)
  19. Hive实战 --- 电子商务消费行为分析
  20. 基于Matlab的3-D胸部扫描CT切片的肺部分割——使用活动轮廓(snakes)进行三维分割及建模

热门文章

  1. mysql 触发器 lod_MySQL--初探触发器的使用和理解
  2. php中html写法,细致说明注解三种PHP嵌套HTML的写法_后端开发
  3. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  4. php编程之如何调用支付宝支付接口的实现
  5. 关于esp32的省电模式的WiFi连接
  6. 新建一个express工程,node app无反应
  7. server2003虚拟机损坏后的文件找回
  8. 两种不同编码规则的查询
  9. unicode学习笔记
  10. USACO全部月赛及GateWay数据