Visual C++中Tab View的多种实现方法
本文实例讲述了Visual C++中Tab View的多种实现方法,分享给大家供大家参考。具体如下:
一、引言
标签控件(Tab Control)是VC++编程中经常使用的控件之一,它允许在单个对话框或窗口中设置多个页面,每个页面代表一组控件。当某个页面的标签被选中时,该页 面内的控件就会被显示出来。标签控件使得在有限的窗口空间内可以显示更多的信息,而且分类清晰。同时,VC++提供了以文档/视图 (Document/View)结构方式开发应用程序的简单方法,在文档中保存数据,在视图中显示数据。无论是在SDI还是MDI的程序中,每个文档可以 对应一个或多个是视图,但常常在显示数据时,需要将同一组数据用不同的视图显示,如列表视图、树型视图等,或者用一个视图显示一部分数据,用另一个视图显 示另一部分数据,并且希望能在同一个显示区显示,在需要时进行切换。将标签控制运用到多视图的切换中,就形成了Tab View。
通过上面的分析,我们不难发现,实现一个Tab View主要要完成以下两方面的工作:
① 实现一个标签窗口。它要具有绘制窗口、响应用户选择、判断处理用户选择等功能。本文对Tab View 实现方法的分类就是根据标签窗口不同划分的。
② 多个视图之间的切换。根据标签窗口判断用户选择的结果,从多个视图中选择一个,在显示区中显示。
本文分析和总结了三种Tab View的实现方法:
1)利用CTabCtrl控件实现Tab View.
2)利用CSheetCtrl标签选择窗口实现Tab View.
3)利用静态分割窗口实现Tab View.
二、CTabCtrl控件实现Tab View
CTabCtrl是MFC类库中定义的标准控件类,通过对消息TCN-SELCHANGE的处理以及运用函数GetCurSel()、 SetCurSel()等,可以很好地完成响应、判断和设置标签控制的工作,因此利用CTabCtrl控件实现Tab View是较容易的方法。
1.实现的主要类
class CMyView1 : public CListView
class CMyView2 : public CView
//派生的标签控件类
class CViewTabCtrl : public CTabCtrl
//定义了Tab view的主窗口
class CTabCtrlView : public CWnd
{
protected:
CViewTabCtrl m_TabCtl;
…
}
class CMainFrame : public CFrameWnd
{
CTabCtrlView m_TabView;
…
}
2.窗口之间的父子关系以及位置关系
下述代码确定各窗口之间的位置关系。
{ …
CRect rect;
// CTabCtrlView窗口的客户区大小
GetClientRect(&rect);
m_TabCtl.RecalcLayout(rect, pWnd);
…
}
void CViewTabCtrl::RecalcLayout(CRect & rect, CWnd * wnd)
{
//标签控件占据CTabCtrlView窗口的客户区
SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, SWP_NOZORDER);
//调整要显示的视窗口位置,使其占据标签控件的显示区
AdjustRect(FALSE, &rect);
wnd->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, SWP_NOZORDER);
}
3.多个视之间切换的实现
视的切换主要完成下面的工作:
CView* pOldActiveView = GetActiveView();
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);
// 步骤2:生成一个新的与所选择的视窗口对应的运行时类
CRuntimeClass* pNewViewClass;
switch (nViewID)// nViewID各个视图的标识
{
case ID_MYVIEW1:
pNewViewClass = RUNTIME_CLASS(CMyView1);
break;
case ID_MYVIEW2:
pNewViewClass = RUNTIME_CLASS(CMyView2);
break;
default:
ASSERT(0);
return;
}
// 步骤3:准备新视图类的相关上下文,创建新的视
CCreateContext Context;
Context.m_pNewViewClass = pNewViewClass;
Context.m_pCurrentDoc = GetActiveDocument();
CView* pNewView = m_TabView.CreateView(pNewViewClass, CSize(100,100), &Context);
if (pNewView != NULL)
{
// 步骤4:显示新的视图
pNewView->ShowWindow(SW_SHOW);
SetActiveView(pNewView);
…
// 步骤5:关闭旧的视图
pOldActiveView->DestroyWindow();
}
在视图切换过程中,都需要重新生成新视图,关闭旧的视图。但在某些情况下,希望多个视图窗口能够同时存在,在某时刻只显示一个,而隐藏其它的窗口。可以通过定义下面的数据结构和变量,将每次加入的新视图的窗口信息保存。
{
CWnd *pWnd; //窗口指针
char szLabel[32]; //标签窗口对应该视图的字符串
}TCB_ITEM;
//将每次如入的视图信息保存到列表中
CList <TCB_ITEM *,TCB_ITEM *> m_Views;