做作vc界面的都知道,如果在遇到多个控件用tabctrl分组显示时是一件很繁琐的事情,同时代码量也特别的大下面是我今天下午刚刚想出的一个自己认为满意的解决办法。
主要思路如下:
做一个类CTabContainer,在初始化的时候确定将控件id分成几组(也就是几个tab标签),然后为每一组做一个链表分别保存每一个tab下属的控件id集。这样的话,只需在对话框初始化时做好一个基本的设定,然后在OnSelchangeTab1写上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的源代码:
classCTabContainer
{
public:
CTabContainer();
virtual~CTabContainer();
CTabContainer(constCTabContainer&tabContainer);
constCTabContainer&operator=(constCTabContainer&tabContainer);
BOOLInit(intnTabs,CWnd*pParent);
//初始化tab,nTabs代表有几个按扭
BOOLAddCtrlId(intnTab,intnID);//将id添加到哪个tab中
BOOLDelete(intnTab,intnID);//删除id
voidShow(intnTab);//当前显示哪个tab
voidClear(void);//释放内存和清理工作
protected:
typedefCListINT,INT&CIntList;
CIntList*m_pIDGroups;//指向链表的指针
intm_nLCount;//链表的个数
CWnd*m_pParent;//父窗体指针
};
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
//构造函数
CTabContainer::CTabContainer()
{
m_pParent=NULL;
m_pIDGroups=NULL;
m_nLCount=0;
}
/////////////////////////////////////////////////////////////////
//虚拟析构函数
CTabContainer::~CTabContainer()
{
Clear();
}
///////////////////////////////////////////////////////////////
//拷贝构造函数
CTabContainer::CTabContainer(constCTabContainer&tabContainer)
{
//待实现
Clear();
}
//////////////////////////////////////////////////////////////
//重载赋值运算符
constCTabContainer&CTabContainer::operator=(constCTabContainer&tabContainer)
{
//待实现
return*this;
}
/////////////////////////////////////////////////////////////////
//初始化tab,nTabs代表有几个按扭
BOOLCTabContainer::Init(intnTabs,CWnd*pParent)
{
ASSERT(nTabs0&&pParent!=NULL);
Clear();
m_nLCount=nTabs;
m_pParent=pParent;
m_pIDGroups=newCIntList[nTabs];
ASSERT(m_pIDGroups!=NULL);
returnTRUE;
}
///////////////////////////////////////////////////////////
//将id添加到哪个tab中
BOOLCTabContainer::AddCtrlId(intnTab,intnID)
{
ASSERT(nTabM_NLCOUNT);
m_pIDGroups[nTab].AddTail(nID);
returnTRUE;
}
/////////////////////////////////////////////////////////////
//删除指定的id
BOOLCTabContainer::Delete(intnTab,intnID)
{
ASSERT(nTabM_NLCOUNT);
m_pIDGroups[nTab].RemoveAt(m_pIDGroups[nTab].Find(nID));
returnTRUE;
}
/////////////////////////////////////////////////////////////
//当前显示哪个tab
voidCTabContainer::Show(intnTab)
{
ASSERT(nTabM_NLCOUNT);
intnID=0;
POSITIONnPos=0;
for(inti=0;iM_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);
}
}
}
////////////////////////////////////////////////////////////////////////
//释放内存和清理工作
voidCTabContainer::Clear(void)
{
if(m_pIDGroups!=NULL)
{
delete[]m_pIDGroups;
m_pIDGroups=NULL;
m_nLCount=0;
}
}