做作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;
}
}
本文地址:http://com.8s8s.com/it/it1336.htm