在VC中使用TabCtrl(TAB控件)

本文档详细介绍了如何在Visual C++中使用CTabCtrl类创建和管理选项卡,包括添加、删除页面,设置选项卡位置,启用/禁用选项卡等功能,并提供了源代码示例。
摘要由CSDN通过智能技术生成
在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---------------------------------------///
  1. #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
  2. #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6. // TabSheet.h : header file
  7. //
  8. /
  9. // CTabSheet window
  10. class CTabSheet : public CTabCtrl
  11. {
  12. // Construction
  13. public:
  14.     CTabSheet();
  15.     virtual ~CTabSheet();
  16. // Attributes
  17. public:
  18. // Operations
  19. public:
  20. // Overrides
  21.     // ClassWizard generated virtual function overrides
  22.     //{ {AFX_VIRTUAL(CTabSheet)
  23. protected:
  24.     virtual  void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  25.     // override to draw text only; eg, colored text or different font
  26.     virtual  void OnDrawText(CDC& dc, CRect rc, CString sText, BOOL bDisabled, UINT format);
  27.     virtual void PreSubclassWindow();
  28.     //}}AFX_VIRTUAL
  29. // Implementation
  30. public:
  31.     int GetCurSel();
  32.     int SetCurSel(int nItem);
  33.     //void Show();
  34.     BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID, int nImage=-1);
  35.     void EnableTab(int iIndex, BOOL bEnable = TRUE);//Index从0开始计数
  36.     void EnableAllTabs(BOOL bEnable = TRUE);
  37.     void DeleteAllTabs();
  38.     void DeleteTab(int iIndex);
  39.     virtual BOOL IsTabEnabled(int iIndex);
  40.     BOOL HideTab(BOOL bHide = FALSE);
  41.     BOOL IsTabHided();
  42.     enum ITEMPOS{TOP,BOTTOM,LEFT,RIGHT};//设置选项卡的位置:顶、底、左、右
  43.     void SetItemPos(ITEMPOS nItemPos);//设置选项卡的位置:顶、底、左、右
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值