TabWnd.cpp
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:5k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. // TabWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TabWnd.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. #define TAB_HEIGHT  21
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTabWnd
  13. CTabWnd::CTabWnd()
  14. {
  15. this->OnTab = NULL;
  16. this->pContext = NULL;
  17. }
  18. CTabWnd::~CTabWnd()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CTabWnd, CTabCtrl)
  22. //{{AFX_MSG_MAP(CTabWnd)
  23. ON_WM_DESTROY()
  24. ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
  25. ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnSelchanging)
  26. ON_WM_SIZE()
  27. ON_WM_CREATE()
  28. ON_WM_PAINT()
  29. //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CTabWnd message handlers
  33. void CTabWnd::PreSubclassWindow() 
  34. {
  35. this->SetFont( this->GetParent( )->GetFont( ) );
  36. this->ModifyStyle( 0 , TCS_OWNERDRAWFIXED );
  37. CTabCtrl::PreSubclassWindow();
  38. }
  39. int CTabWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  40. {
  41. if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
  42. return -1;
  43. this->SetFont( this->GetParent( )->GetFont( ) );
  44. this->ModifyStyle( 0 , TCS_OWNERDRAWFIXED );
  45. return 0;
  46. }
  47. void CTabWnd::RegisterTabChangeEvent( void ( * OnTab )( void * pContext , int index , bool m_bShow ) , void * pContext )
  48. {
  49. this->OnTab = OnTab;
  50. this->pContext = pContext;
  51. }
  52. bool CTabWnd::AddTab( LPCSTR name )
  53. {
  54. if( name && strlen( name ) )
  55. return this->InsertItem( this->GetItemCount( ) , name );
  56. return false;
  57. }
  58. bool CTabWnd::AddWnd( CWnd * pWnd , LPCSTR name ,  bool autoDelete )
  59. {
  60. ASSERT( pWnd != NULL );
  61. if( ! ::IsWindow( pWnd->GetSafeHwnd( ) ) ) return false;
  62. pWnd->SetParent( this );
  63. pWnd->ModifyStyle( WS_CAPTION | WS_BORDER | WS_THICKFRAME , 0 );
  64. pWnd->ShowWindow( SW_MAXIMIZE );
  65. CRect rc;
  66. this->GetClientRect( &rc );
  67. rc.bottom -= TAB_HEIGHT;
  68. pWnd->MoveWindow( rc );
  69. CString szName;
  70. if( name ) 
  71. szName = name;
  72. else
  73. pWnd->GetWindowText( szName );
  74. pWnd->ShowWindow( ! this->InsertItem( TCIF_TEXT | TCIF_PARAM  , this->GetItemCount( ) , szName , 0 , ( int )pWnd ) ? SW_SHOW : SW_HIDE );
  75. ::SetWindowLong( pWnd->GetSafeHwnd( ) , GWL_USERDATA , autoDelete );
  76. return true;
  77. }
  78. void CTabWnd::OnDestroy() 
  79. {
  80. for( int i = 0; i < this->GetItemCount( ) ; i ++ )
  81. {
  82. try
  83. {
  84. CWnd * pWnd = this->GetWnd( i );
  85. if( pWnd )
  86. {
  87. bool del = ( bool )::GetWindowLong( pWnd->GetSafeHwnd( ) , GWL_USERDATA );
  88. pWnd->DestroyWindow( );
  89. if( del )
  90. delete pWnd;
  91. }
  92. }
  93. catch( ... )
  94. {
  95. }
  96. }
  97. CTabCtrl::OnDestroy();
  98. }
  99. CWnd * CTabWnd::GetWnd( int index )
  100. {
  101. TCITEM item;
  102. item.mask = TCIF_PARAM ;
  103. if( index == -1 ) 
  104. index = this->GetCurSel( );
  105. this->GetItem( index , &item );
  106. return ( CWnd * )item.lParam;
  107. }
  108. void CTabWnd::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) 
  109. {
  110. CWnd * pWnd = this->GetWnd( );
  111. if( pWnd )
  112. pWnd->ShowWindow( SW_HIDE );
  113. if( this->OnTab )
  114. this->OnTab( this->pContext , this->GetCurSel( ) , false );
  115. if( pResult )
  116. *pResult = 0;
  117. }
  118. void CTabWnd::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
  119. {
  120. CWnd * pWnd = this->GetWnd( );
  121. if( pWnd )
  122. pWnd->ShowWindow( SW_SHOW );
  123. if( this->OnTab )
  124. this->OnTab( this->pContext , this->GetCurSel( ) , true );
  125. if( pResult )
  126. *pResult = 0;
  127. this->Invalidate( );
  128. }
  129. int CTabWnd::SetCurSel( int nItem )
  130. {
  131. if( this->GetSafeHwnd( ) )
  132. {
  133. this->OnSelchanging( 0 , 0 );
  134. int ret = CTabCtrl::SetCurSel( nItem );
  135. this->OnSelchange( 0 , 0 );
  136. return ret;
  137. }
  138. return -1;
  139. }
  140. void CTabWnd::GetClientRect( LPRECT lpRect )
  141. {
  142. CTabCtrl::GetClientRect( lpRect );
  143. lpRect->bottom -= TAB_HEIGHT;
  144. }
  145. BOOL CTabWnd::OnCommand(WPARAM wParam, LPARAM lParam) 
  146. {
  147. if( this->GetParent( ) )
  148. return this->GetParent( )->SendMessage( WM_COMMAND , wParam , lParam );
  149. return CTabCtrl::OnCommand( wParam, lParam ); 
  150. }
  151. void CTabWnd::OnSize(UINT nType, int cx, int cy) 
  152. {
  153. CTabCtrl::OnSize(nType, cx, cy);
  154. for( int i = 0; i < this->GetItemCount( ) ; i ++ )
  155. {
  156. CWnd * pWnd = this->GetWnd( i );
  157. if( pWnd )
  158. pWnd->MoveWindow( 0 , 0 , cx , cy - TAB_HEIGHT );
  159. }
  160. }
  161. void CTabWnd::OnPaint() 
  162. {
  163. CPaintDC dc( this );
  164. CRect rc;
  165. dc.GetClipBox( &rc );
  166. dc.FillSolidRect( &rc , RGB( 214 , 239 , 255 ) );
  167. CTabCtrl::DefWindowProc( WM_PAINT ,( WPARAM )dc.GetSafeHdc( ) , 0 );
  168. }
  169. void CTabWnd::DrawItem( LPDRAWITEMSTRUCT lpDS )
  170. {
  171. CDC dc;
  172. dc.Attach( lpDS->hDC );
  173. char buf[255];
  174. TCITEM item;
  175. item.mask = TCIF_TEXT; 
  176. item.pszText = buf;
  177. item.cchTextMax = sizeof( buf );
  178. this->GetItem( lpDS->itemID , &item );
  179. dc.SetBkMode( TRANSPARENT );
  180. dc.SetTextColor( RGB( 10 , 10 , 10 ) );
  181. CRect rc( lpDS->rcItem );
  182. if( lpDS->itemID == this->GetCurSel( ) )
  183. {
  184. dc.FillSolidRect( &rc , RGB( 214 , 239 , 255 ) );
  185. rc.OffsetRect( 1 , 3 );
  186. }
  187. dc.DrawText( buf , &rc , DT_CENTER );
  188. dc.Detach( );
  189. }