STabCtrl.cpp
上传用户:shqgfm2
上传日期:2013-03-07
资源大小:13k
文件大小:4k
源码类别:

Tab控件

开发平台:

Visual C++

  1. // STabCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "STabCtrl.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. CSTabCtrl::CSTabPage::CSTabPage()
  11. {
  12. }
  13. CSTabCtrl::CSTabPage::~CSTabPage()
  14. {
  15. m_ControlList.RemoveAll();
  16. }
  17. BOOL CSTabCtrl::CSTabPage::AttachControl (CWnd * _pControl)
  18. {
  19. return (BOOL) m_ControlList.AddTail (_pControl);
  20. }
  21. BOOL CSTabCtrl::CSTabPage::ShowWindows ( INT _nCmdShow )
  22. {
  23. POSITION _rPos = m_ControlList.GetHeadPosition();
  24. CWnd * _pCtrl = NULL;
  25. while(_rPos)
  26. {
  27. _pCtrl = m_ControlList.GetNext(_rPos);
  28. ::ShowWindow(_pCtrl -> GetSafeHwnd(), _nCmdShow );
  29. // cannot use because using this call with the MS WebBrowser
  30. // control destroys the control's window.
  31. //_pCtrl -> ShowWindow(_nCurrSel == _rKey);
  32. }
  33. return TRUE;
  34. }
  35. BOOL CSTabCtrl::CSTabPage::EnableWindows ( BOOL _bEnable )
  36. {
  37. POSITION _rPos = m_ControlList.GetHeadPosition();
  38. CWnd * _pCtrl = NULL;
  39. while(_rPos)
  40. {
  41. _pCtrl = m_ControlList.GetNext(_rPos);
  42. ::EnableWindow(_pCtrl -> GetSafeHwnd(), _bEnable );
  43. }
  44. return TRUE;
  45. }
  46. CSTabCtrl::CPageToControlsMap::CPageToControlsMap( )
  47. {
  48. }
  49. CSTabCtrl::CPageToControlsMap::~CPageToControlsMap( )
  50. {
  51. CPageToControlsMap::RemoveAll();
  52. }
  53. BOOL CSTabCtrl::CPageToControlsMap::AttachControl(INT _nTabNum,CWnd * _pControl)
  54. {
  55. CSTabPage * _pTabPage = NULL;
  56. if(!Lookup(_nTabNum,_pTabPage) || !_pTabPage)
  57. {
  58. _pTabPage = new CSTabPage();
  59. SetAt(_nTabNum, _pTabPage);
  60. }
  61. if(_pTabPage -> AttachControl(_pControl))
  62. {
  63. // make sure control is hidden...
  64. ::ShowWindow( _pControl -> GetSafeHwnd(), SW_HIDE );
  65. return TRUE;
  66. }
  67. else
  68. {
  69. return FALSE;
  70. }
  71. }
  72. BOOL CSTabCtrl::CPageToControlsMap::EnableWindows ( INT _nCurrPage, BOOL _bEnable )
  73. {
  74. CList <CWnd *, CWnd *> * _pCtrlList = NULL;
  75. CSTabPage * _pTabPage = NULL;
  76. if(Lookup(_nCurrPage,_pTabPage) && _pTabPage)
  77. {
  78. return _pTabPage -> EnableWindows ( _bEnable );
  79. }
  80. else
  81. {
  82. return FALSE;
  83. }
  84. }
  85. BOOL CSTabCtrl::CPageToControlsMap::ShowWindows ( INT _nCurrPage, INT _nCmdShow )
  86. {
  87. CList <CWnd *, CWnd *> * _pCtrlList = NULL;
  88. CSTabPage * _pTabPage = NULL;
  89. if(Lookup(_nCurrPage,_pTabPage) && _pTabPage)
  90. {
  91. return _pTabPage -> ShowWindows ( _nCmdShow );
  92. }
  93. else
  94. {
  95. return FALSE;
  96. }
  97. }
  98. void CSTabCtrl::CPageToControlsMap::RemoveAll( )
  99. {
  100. POSITION _rPos = GetStartPosition();
  101. CSTabPage * _pValue = NULL;
  102. INT _rKey;
  103. while(_rPos)
  104. {
  105. GetNextAssoc(_rPos,_rKey,_pValue);
  106. delete _pValue;
  107. }
  108. CMap <INT, INT&,CSTabPage *, CSTabPage *>::RemoveAll();
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CSTabCtrl
  112. CSTabCtrl::CSTabCtrl()
  113. {
  114. m_nPrevSel = -1;
  115. }
  116. CSTabCtrl::~CSTabCtrl()
  117. {
  118. }
  119. BEGIN_MESSAGE_MAP(CSTabCtrl, CTabCtrl)
  120. //{{AFX_MSG_MAP(CSTabCtrl)
  121. ON_NOTIFY_REFLECT_EX(TCN_SELCHANGE, OnSelchange)
  122. ON_WM_DESTROY()
  123. ON_WM_CREATE()
  124. ON_WM_ENABLE()
  125. //}}AFX_MSG_MAP
  126. END_MESSAGE_MAP()
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CSTabCtrl message handlers
  129. int CSTabCtrl::SetCurSel( int nItem )
  130. {
  131. int _nRetVal = CTabCtrl::SetCurSel(nItem);
  132. NMHDR _nDummyNMHDR;
  133. LRESULT _nDummyLRESULT;
  134. OnSelchange(&_nDummyNMHDR,&_nDummyLRESULT);
  135. return _nRetVal;
  136. }
  137. BOOL CSTabCtrl::AttachControlToTab(CWnd * _pControl,
  138. INT _nTabNum)
  139. {
  140. if(_nTabNum >= GetItemCount())
  141. {
  142. ASSERT(FALSE);
  143. return FALSE;
  144. }
  145. m_TabPagesMap.AttachControl (_nTabNum,_pControl);
  146. return TRUE;
  147. }
  148. void CSTabCtrl::OnEnable( BOOL bEnable )
  149. {
  150. CTabCtrl::OnEnable(bEnable);
  151. INT _nTabPageCount (GetItemCount());
  152. for(INT i = 0; i < _nTabPageCount; i ++)
  153. {
  154. m_TabPagesMap.EnableWindows (i, bEnable);
  155. }
  156. }
  157. BOOL CSTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
  158. {
  159. // TODO: Add your control notification handler code here
  160. INT _nCurrSel = GetCurSel();
  161. // hide Previous pages controls...
  162. m_TabPagesMap.ShowWindows (m_nPrevSel, SW_HIDE);
  163. // show current pages controls.
  164. m_TabPagesMap.ShowWindows (_nCurrSel, SW_SHOW);
  165. m_nPrevSel = _nCurrSel;
  166. *pResult = 0;
  167. return FALSE; // allow control to handle as well.
  168. }
  169. int CSTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  170. {
  171. m_nPrevSel = -1;
  172. return 0;
  173. }
  174. void CSTabCtrl::OnDestroy() 
  175. {
  176. CTabCtrl::OnDestroy();
  177. // clean up map.
  178. m_TabPagesMap.RemoveAll();
  179. }