VC下TabCtrl的控制問題解決辦法( 原創 ) (轉)

amyz發表於2007-11-28
VC下TabCtrl的控制問題解決辦法( 原創 ) (轉)[@more@]


做作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 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_pIDGroups[nTab].AddTail(nID);
 return TRUE;
}

/////////////////////////////////////////////////////////////////////////////////////
//刪除指定的id
BOOL CTabContainer::Delete(int nTab,int nID)
{
 ASSERT(nTab m_pIDGroups[nTab].RemoveAt(m_pIDGroups[nTab].Find(nID));
 return TRUE;
}

/////////////////////////////////////////////////////////////////////////////////////
//當前顯示哪個tab
void CTabContainer::Show(int nTab)
{
 ASSERT(nTab int nID=0;
 POSITION nPos=0;
 for(int i=0;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_H);
 }
 }

}

/////////////////////////////////////////////////////////////////////////////////////
//釋放記憶體和清理工作
void CTabContainer::Clear(void)
{
 if(m_pIDGroups!=NULL)
 {
 delete []m_pIDGroups;
 m_pIDGroups=NULL;
 m_nLCount=0;
 }

}


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-985642/,如需轉載,請註明出處,否則將追究法律責任。

相關文章