VC下TabCtrl的控制问题解决办法( 原创 )

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

做作vc界面的都知道,如果在遇到多个控件用tabctrl分组显示时是一件很繁琐的事情,同时代码量也特别的大

。下面是我今天下午刚刚想出的一个自己认为满意的解决办法。

主要思路如下:

做一个类CTabContainer,在初始化的时候确定将控件id分成几组(也就是几个tab 标签),然后为每一组做一个

链表分别保存每一个tab下属的控件id集。这样的话,只需在对话框初始化时做好一个基本的设定,然后在OnSe

lchangeTab1写上m_pTabContainer->Show(m_tab.GetCurSel());就可以了

类的使用方法:

在OnInitDialog()里面

m_pTabContainer->Init(3,this); // 3个tab标签按钮,this 对话框指针。

m_pTabContainer->AddCtrlId(0,IDC_BUTTON1);//IDC_BUTTON1加到第一组tab当中

m_pTabContainer->AddCtrlId(0,IDC_BUTTON4);//下面类似

m_pTabContainer->AddCtrlId(0,IDC_BUTTON5);

m_pTabContainer->AddCtrlId(1,IDC_BUTTON2);

m_pTabContainer->AddCtrlId(1,IDC_BUTTON6);

m_pTabContainer->AddCtrlId(2,IDC_BUTTON3);

m_pTabContainer->AddCtrlId(2,IDC_BUTTON7);

m_pTabContainer->AddCtrlId(2,IDC_BUTTON8);

m_pTabContainer->Show(0);//默认显示第一个标签下面的控件

在控件TAb的事件 OnSelchangeTab1

m_pTabContainer->Show(m_tab.GetCurSel());即可

另附类CTabContainer的源代码:

class CTabContainer

{

public:

CTabContainer();

virtual ~CTabContainer();

CTabContainer(const CTabContainer & tabContainer);

const CTabContainer & operator =(const CTabContainer & tabContainer);

BOOL Init(int nTabs,CWnd * pParent);

//初始化tab,nTabs代表有几个按扭

BOOL AddCtrlId(int nTab,int nID);//将id添加到哪个tab中

BOOL Delete(int nTab,int nID);//删除id

void Show(int nTab);//当前显示哪个tab

void Clear(void);//释放内存和清理工作

protected:

typedef CList<int,int&> CIntList;

CIntList * m_pIDGroups; //指向链表的指针

int m_nLCount;//链表的个数

CWnd * m_pParent;//父窗体指针

};

///////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////

//构造函数

CTabContainer::CTabContainer()

{

m_pParent=NULL;

m_pIDGroups=NULL;

m_nLCount=0;

}

/////////////////////////////////////////////////////////////////////////////////////

//虚拟析构函数

CTabContainer::~CTabContainer()

{

Clear();

}

/////////////////////////////////////////////////////////////////////////////////////

//拷贝构造函数

CTabContainer::CTabContainer(const CTabContainer & tabContainer)

{

//待实现

Clear();

}

/////////////////////////////////////////////////////////////////////////////////////

//重载赋值运算符

const CTabContainer & CTabContainer::operator =(const CTabContainer & tabContainer)

{

//待实现

return *this;

}

/////////////////////////////////////////////////////////////////////////////////////

//初始化tab,nTabs代表有几个按扭

BOOL CTabContainer::Init(int nTabs,CWnd * pParent)

{

ASSERT(nTabs>0 && pParent!=NULL);

Clear();

m_nLCount=nTabs;

m_pParent=pParent;

m_pIDGroups=new CIntList[nTabs];

ASSERT(m_pIDGroups!=NULL);

return TRUE;

}

/////////////////////////////////////////////////////////////////////////////////////

//将id添加到哪个tab中

BOOL CTabContainer::AddCtrlId(int nTab,int nID)

{

ASSERT(nTab<m_nLCount);

m_pIDGroups[nTab].AddTail(nID);

return TRUE;

}

/////////////////////////////////////////////////////////////////////////////////////

//删除指定的id

BOOL CTabContainer::Delete(int nTab,int nID)

{

ASSERT(nTab<m_nLCount);

m_pIDGroups[nTab].RemoveAt(m_pIDGroups[nTab].Find(nID));

return TRUE;

}

/////////////////////////////////////////////////////////////////////////////////////

//当前显示哪个tab

void CTabContainer::Show(int nTab)

{

ASSERT(nTab<m_nLCount);

int nID=0;

POSITION nPos=0;

for(int i=0;i<m_nLCount;i++)

{

nPos=m_pIDGroups[i].GetHeadPosition();

while(nPos!=NULL)

{

nID=m_pIDGroups[i].GetNext(nPos);

m_pParent->GetDlgItem(nID)->ShowWindow( (i==nTab) ? SW_SHOW : SW_HIDE);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////

//释放内存和清理工作

void CTabContainer::Clear(void)

{

if(m_pIDGroups!=NULL)

{

delete []m_pIDGroups;

m_pIDGroups=NULL;

m_nLCount=0;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航