做作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; }
}

|