程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> VC下TabCtrl的控制問題解決辦法

VC下TabCtrl的控制問題解決辦法

編輯:VC++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved