【VS开发】使用CTabView分割多页卡窗口
来源:互联网 发布:复杂网络 院士 编辑:程序博客网 时间:2024/05/21 06:16
一般书中介绍的是使用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指针了。
- 【VS开发】使用CTabView分割多页卡窗口
- 【VS开发】CTabView多页卡界面
- 【VS开发】学习VS2010 ------ 多种类型的视图集合CTabView
- vim 窗口分割使用
- 使用CSplitterWnd类分割窗口
- 使用CSplitterWnd分割View窗口
- VS 即时窗口 的使用
- 【视图分割】使用VC6.0实现窗口的任意分割
- 使用SplitterWindow实现窗口的任意分割
- MFC使用CSplitterWnd分割窗口的创建
- Qt使用QSplitter实现分割窗口
- Qt使用QSplitter实现分割窗口
- 使用VC实现窗口的任意分割
- MFC使用createview分割视图窗口
- 在VC对话框中使用分割窗口
- QT5学习:分割窗口类的使用
- Qt使用QSplitter实现分割窗口
- Qt使用QSplitter实现分割窗口
- 二叉树前序,中序,后序遍历(递归)
- 使用WebDriver的过程中遇到的一个Bug
- 打字测试
- 1、面向对象和面向过程的区别
- 一道题识别不靠谱的程序员
- 【VS开发】使用CTabView分割多页卡窗口
- python数字图像处理:直方图与均衡化
- 网上看到的学习maven不错的几篇博文
- 大小不固定的图片和多行文字的垂直水平居中
- 碎片和活动之间进行通信、碎片之间进行通信
- UVa 1584 Circular Sequence
- platform简述
- Java 对象初始化过程
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算