在VC中使用TabCtrl无疑是一件相当令人头疼的事情,而偏偏网上的相关资料又比较稀少,一些现成解决方案也多少存在一些问题,于是参考一些现成的TabCtrl类经过糅合修改成以下的一个类:CTabSheet
该类以vckbase的一篇文章《 在对话框中加入属性页》中提到的“方案五”的CTabSheet类为模板,并参考 CodeProject的CXTabCtrl、XPTabCtrl以及网上的一些其它资料修改而成。
该类具有以下特点:每个标签页都使用一个对话框以设计该页界面,可以随意设置禁用某页,可以设置隐藏TAB控件(用各页的对话框遮盖),可以随意设置选项卡的位置(顶部、底部、左边、右边),可以自由的添加或删除某页,可以为某个选项卡添加图标。
使用方法:
添加对话框资源,并且各个子对话框资源的属性应设置为:Style为Child,Border为None。为这些对话框建立类(直接从CDialog继承)如CPage1、CPage2……
在主对话框的类中添加成员变量:CPage1 m_Page1;、CPage2 m_Page2;……
在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量m_TabSheet。
在主对话框的OnInitDialog()加入:
m_TabSheet.AddPage("tab1", &m_page1, IDD_DIALOG1);
m_TabSheet.AddPage("tab2", &m_page2, IDD_DIALOG2);
……
如果要给标签加上图标,在AddPage之前设置好ImageList:
//为TabCtrl控件添加图标
m_imageList.Create(16, 16, ILC_COLOR32, 1, 1);
CBitmap bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
m_imageList.Add(&bitmap1, RGB(0,0,0));
m_imageList.Add(&bitmap2, RGB(0,0,0));
m_TabSheet.SetImageList(&m_imageList);
//给TabCtrl添加页
m_TabSheet.AddPage(_T("Page1"), &m_Page1, m_Page1.IDD, 0);
m_TabSheet.AddPage(_T("第二页"), &m_Page2, m_Page2.IDD, 1);
很不可思议的是,我在测试中,如果在工程中没有把TabCtrl的标签设置成左边或右边的话,那么在运行时修改标签的位置为左边或右边时会出现问题,但是只要曾经设置过TabCtrl的标签为左边或右边后,以后运行不管工程中的TabCtrl的标签是怎样设置的,在运行时都可以正确的修改其标签的位置。
示例工程文件见我的网络硬盘:http://wooddoor.ys168.com/
以下是该CTabSheet类的源码:
//------------------------------TabSheet.h---------------------------------------///
该类以vckbase的一篇文章《 在对话框中加入属性页》中提到的“方案五”的CTabSheet类为模板,并参考 CodeProject的CXTabCtrl、XPTabCtrl以及网上的一些其它资料修改而成。
该类具有以下特点:每个标签页都使用一个对话框以设计该页界面,可以随意设置禁用某页,可以设置隐藏TAB控件(用各页的对话框遮盖),可以随意设置选项卡的位置(顶部、底部、左边、右边),可以自由的添加或删除某页,可以为某个选项卡添加图标。
使用方法:
添加对话框资源,并且各个子对话框资源的属性应设置为:Style为Child,Border为None。为这些对话框建立类(直接从CDialog继承)如CPage1、CPage2……
在主对话框的类中添加成员变量:CPage1 m_Page1;、CPage2 m_Page2;……
在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量m_TabSheet。
在主对话框的OnInitDialog()加入:
m_TabSheet.AddPage("tab1", &m_page1, IDD_DIALOG1);
m_TabSheet.AddPage("tab2", &m_page2, IDD_DIALOG2);
……
如果要给标签加上图标,在AddPage之前设置好ImageList:
//为TabCtrl控件添加图标
m_imageList.Create(16, 16, ILC_COLOR32, 1, 1);
CBitmap bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
m_imageList.Add(&bitmap1, RGB(0,0,0));
m_imageList.Add(&bitmap2, RGB(0,0,0));
m_TabSheet.SetImageList(&m_imageList);
//给TabCtrl添加页
m_TabSheet.AddPage(_T("Page1"), &m_Page1, m_Page1.IDD, 0);
m_TabSheet.AddPage(_T("第二页"), &m_Page2, m_Page2.IDD, 1);
很不可思议的是,我在测试中,如果在工程中没有把TabCtrl的标签设置成左边或右边的话,那么在运行时修改标签的位置为左边或右边时会出现问题,但是只要曾经设置过TabCtrl的标签为左边或右边后,以后运行不管工程中的TabCtrl的标签是怎样设置的,在运行时都可以正确的修改其标签的位置。
示例工程文件见我的网络硬盘:http://wooddoor.ys168.com/
以下是该CTabSheet类的源码:
//------------------------------TabSheet.h---------------------------------------///
- #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
- #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- // TabSheet.h : header file
- //
- /
- // CTabSheet window
- class CTabSheet : public CTabCtrl
- {
- // Construction
- public:
- CTabSheet();
- virtual ~CTabSheet();
- // Attributes
- public:
- // Operations
- public:
- // Overrides
- // ClassWizard generated virtual function overrides
- //{ {AFX_VIRTUAL(CTabSheet)
- protected:
- virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
- // override to draw text only; eg, colored text or different font
- virtual void OnDrawText(CDC& dc, CRect rc, CString sText, BOOL bDisabled, UINT format);
- virtual void PreSubclassWindow();
- //}}AFX_VIRTUAL
- // Implementation
- public:
- int GetCurSel();
- int SetCurSel(int nItem);
- //void Show();
- BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID, int nImage=-1);
- void EnableTab(int iIndex, BOOL bEnable = TRUE);//Index从0开始计数
- void EnableAllTabs(BOOL bEnable = TRUE);
- void DeleteAllTabs();
- void DeleteTab(int iIndex);
- virtual BOOL IsTabEnabled(int iIndex);
- BOOL HideTab(BOOL bHide = FALSE);
- BOOL IsTabHided();
- enum ITEMPOS{TOP,BOTTOM,LEFT,RIGHT};//设置选项卡的位置:顶、底、左、右
- void SetItemPos(ITEMPOS nItemPos);//设置选项卡的位置:顶、底、左、右