做作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:
typedefCList<INT,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(nTabs>0&&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(nTab<M_NLCOUNT);
m_pIDGroups[nTab].AddTail(nID);
returnTRUE;
}
/////////////////////////////////////////////////////////////
//刪除指定的id
BOOLCTabContainer::Delete(intnTab,intnID)
{
ASSERT(nTab<M_NLCOUNT);
m_pIDGroups[nTab].RemoveAt(m_pIDGroups[nTab].Find(nID));
returnTRUE;
}
/////////////////////////////////////////////////////////////
//當前顯示哪個tab
voidCTabContainer::Show(intnTab)
{
ASSERT(nTab<M_NLCOUNT);
intnID=0;
POSITIONnPos=0;
for(inti=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);
}
}
}
////////////////////////////////////////////////////////////////////////
//釋放內存和清理工作
voidCTabContainer::Clear(void)
{
if(m_pIDGroups!=NULL)
{
delete[]m_pIDGroups;
m_pIDGroups=NULL;
m_nLCount=0;
}
}