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

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  22
  11. #pragma comment( lib , "msimg32.lib" )
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTabWnd
  14. CTabWnd::CTabWnd()
  15. {
  16. this->OnTab = NULL;
  17. this->pContext = NULL;
  18. }
  19. CTabWnd::~CTabWnd()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CTabWnd, CTabCtrl)
  23. //{{AFX_MSG_MAP(CTabWnd)
  24. ON_WM_DESTROY()
  25. ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
  26. ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnSelchanging)
  27. ON_WM_SIZE()
  28. ON_WM_CREATE()
  29. ON_WM_LBUTTONDBLCLK()
  30. ON_WM_PAINT()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CTabWnd message handlers
  35. void CTabWnd::PreSubclassWindow() 
  36. {
  37. this->SetFont( this->GetParent( )->GetFont( ) );
  38. CTabCtrl::PreSubclassWindow();
  39. }
  40. int CTabWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  41. {
  42. if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
  43. return -1;
  44. this->SetFont( this->GetParent( )->GetFont( ) );
  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. pWnd->MoveWindow( rc );
  68. CString szName;
  69. if( name ) 
  70. szName = name;
  71. else
  72. pWnd->GetWindowText( szName );
  73. pWnd->ShowWindow( ! this->InsertItem( TCIF_TEXT | TCIF_PARAM  , this->GetItemCount( ) , szName , 0 , ( int )pWnd ) ? SW_SHOW : SW_HIDE );
  74. ::SetWindowLong( pWnd->GetSafeHwnd( ) , GWL_USERDATA , autoDelete );
  75. this->ShowWindow( SW_SHOW );
  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::OnLButtonDblClk( UINT nFlags, CPoint point )
  162. {
  163. TCHITTESTINFO info;
  164. info.pt = point;
  165. info.flags = TCHT_ONITEM;
  166. int index = this->HitTest( &info );
  167. if( index >= 0 )
  168. {
  169. CWnd * wnd = this->GetWnd( index );
  170. this->DeleteItem( index );
  171. wnd->SendMessage( WM_CLOSE );
  172. if( this->GetItemCount( ) <= index )
  173. index--;
  174. if( index >= 0 )
  175. this->SetCurSel( index );
  176. }
  177. if( ! this->GetItemCount( ) )
  178. this->ShowWindow( SW_HIDE );
  179. }
  180. void CTabWnd::OnPaint() 
  181. {
  182. CPaintDC dc( this );
  183. CDC memDC;
  184. memDC.CreateCompatibleDC( &dc );
  185. CBitmap b;
  186. CRect rc;
  187. dc.GetClipBox( &rc );
  188. b.CreateCompatibleBitmap( &dc , rc.Width( ) , rc.Height( ) );
  189. memDC.SelectObject( &b );
  190. CTabCtrl::DefWindowProc( WM_PAINT ,( WPARAM )memDC.GetSafeHdc( ) , 0 );
  191. dc.FillSolidRect( &rc , RGB( 214 , 239 , 255 ) );
  192. ::TransparentBlt( dc.GetSafeHdc( ) , 0 , 0 , rc.Width( ) , rc.Height( ) , memDC.GetSafeHdc( ) , 0 , 0 , rc.Width( ) , rc.Height( ) , RGB( 0 , 0 , 0 ) );
  193. }
  194. void CTabWnd::DrawItem( LPDRAWITEMSTRUCT lpDS )
  195. {
  196. CDC dc;
  197. dc.Attach( lpDS->hDC );
  198. char buf[255];
  199. TCITEM item;
  200. item.mask = TCIF_TEXT; 
  201. item.pszText = buf;
  202. item.cchTextMax = sizeof( buf );
  203. this->GetItem( lpDS->itemID , &item );
  204. dc.SetBkMode( TRANSPARENT );
  205. dc.SetTextColor( RGB( 10 , 10 , 10 ) );
  206. CRect rc( lpDS->rcItem );
  207. if( lpDS->itemID == this->GetCurSel( ) )
  208. rc.OffsetRect( 1 , 3 );
  209. dc.DrawText( buf , &rc , DT_CENTER );
  210. dc.Detach( );
  211. }