TitleTip.h
上传用户:sztopon
上传日期:2014-01-21
资源大小:55k
文件大小:8k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. #pragma once
  2. #include <atltheme.h>
  3. class CTitleTip : public CWindowImpl< CTitleTip >
  4. {
  5. public:
  6. CTitleTip()
  7. {
  8. m_hWndParent = NULL;
  9. m_bShowThemed = TRUE;
  10. }
  11. ~CTitleTip()
  12. {
  13. }
  14. DECLARE_WND_CLASS_EX( _T( "TitleTip" ), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_SAVEBITS, COLOR_WINDOW )
  15. protected:
  16. HWND m_hWndParent;
  17. BOOL m_bShowThemed;
  18. CString m_strToolTip;
  19. COLORREF m_rgbBackground;
  20. COLORREF m_rgbTextColour;
  21. COLORREF m_rgbBorderOuter;
  22. COLORREF m_rgbBorderInner;
  23. COLORREF m_rgbBackgroundTop;
  24. COLORREF m_rgbBackgroundBottom;
  25. CFont m_fntTitleFont;
  26. CToolTipCtrl m_ttToolTip;
  27. public:
  28. BOOL Create( HWND hWndParent, BOOL bShowThemed )
  29. {
  30. m_hWndParent = hWndParent;
  31. m_bShowThemed = bShowThemed;
  32. m_rgbBackground = GetSysColor( COLOR_INFOBK );
  33. m_rgbTextColour = ( m_bShowThemed && CTheme::IsThemingSupported() ) ? GetSysColor( COLOR_WINDOWTEXT ) : GetSysColor( COLOR_INFOTEXT );
  34. m_rgbBorderOuter = RGB( 220, 220, 220 );
  35. m_rgbBorderInner = RGB( 245, 245, 245 );
  36. m_rgbBackgroundTop = RGB( 250, 250, 250 );
  37. m_rgbBackgroundBottom = RGB( 235, 235, 235 );
  38. if ( CWindowImpl< CTitleTip >::Create( hWndParent, NULL, NULL, WS_POPUP, WS_EX_TOOLWINDOW | WS_EX_TOPMOST ) == NULL )
  39. return FALSE;
  40. // create the tooltip
  41. if ( !m_ttToolTip.Create( m_hWnd ) )
  42. return FALSE;
  43. m_ttToolTip.SetMaxTipWidth( SHRT_MAX );
  44. // get system message font
  45. CLogFont logFont;
  46. logFont.SetMessageBoxFont();
  47. if ( !m_fntTitleFont.IsNull() )
  48. m_fntTitleFont.DeleteObject();
  49. return ( m_fntTitleFont.CreateFontIndirect( &logFont ) != NULL );
  50. }
  51. BOOL Show( CRect& rcRect, LPCTSTR lpszItemText, LPCTSTR lpszToolTip )
  52. {
  53. CString strItemText = lpszItemText;
  54. if ( !IsWindow() || strItemText.IsEmpty() )
  55. return FALSE;
  56. m_strToolTip = lpszToolTip;
  57. SetWindowText( strItemText );
  58. CClientDC dcClient( m_hWnd );
  59. HFONT hOldFont = dcClient.SelectFont( m_fntTitleFont );
  60. CRect rcTextExtent( rcRect );
  61. // calculate item text extent...
  62. dcClient.DrawText( strItemText, strItemText.GetLength(), rcTextExtent, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER | DT_CALCRECT );
  63. dcClient.SelectFont( hOldFont );
  64. // do not show titletip if entire text is visible
  65. if ( rcTextExtent.Width() <= rcRect.Width() - 1 )
  66. return FALSE;
  67. if ( m_strToolTip.IsEmpty() )
  68. m_ttToolTip.Activate( FALSE );
  69. else
  70. {
  71. m_ttToolTip.Activate( TRUE );
  72. m_ttToolTip.AddTool( m_hWnd, (LPCTSTR)m_strToolTip.Left( SHRT_MAX ) );
  73. }
  74. // show titletip at new location
  75. if ( !SetWindowPos( NULL, rcRect.left - 4, rcRect.top, rcTextExtent.Width() + 11, rcRect.Height(), SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOCOPYBITS ) )
  76. return FALSE;
  77. SetCapture();
  78. return TRUE;
  79. }
  80. BOOL Hide()
  81. {
  82. if ( GetCapture() == m_hWnd )
  83. ReleaseCapture();
  84. return IsWindow() ? ShowWindow( SW_HIDE ) : FALSE;
  85. }
  86. BEGIN_MSG_MAP_EX(CTitleTip)
  87. MSG_WM_DESTROY(OnDestroy)
  88. MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST,WM_MOUSELAST,OnMouseRange)
  89. MSG_WM_ERASEBKGND(OnEraseBkgnd)
  90. MSG_WM_PAINT(OnPaint)
  91. END_MSG_MAP_EX()
  92. void OnDestroy()
  93. {
  94. if ( m_ttToolTip.IsWindow() )
  95. m_ttToolTip.DestroyWindow();
  96. m_ttToolTip.m_hWnd = NULL;
  97. }
  98. LRESULT OnMouseRange( UINT nMessage, WPARAM wParam, LPARAM lParam )
  99. {
  100. SetMsgHandled( FALSE );
  101. if ( m_ttToolTip.IsWindow() )
  102. {
  103. MSG msgRelay = { m_hWnd, nMessage, wParam, lParam };
  104. m_ttToolTip.RelayEvent( &msgRelay );
  105. }
  106. CPoint ptMouse( GET_X_LPARAM( lParam ), GET_Y_LPARAM( lParam ) );
  107. ClientToScreen( &ptMouse );
  108. if ( nMessage == WM_MOUSEMOVE )
  109. {
  110. CRect rcWindow;
  111. GetWindowRect( rcWindow );
  112. if ( !rcWindow.PtInRect( ptMouse ) )
  113. Hide();
  114. return 0;
  115. }
  116. CWindow wndParent( m_hWndParent );
  117. UINT nHitTest = wndParent.SendMessage( WM_NCHITTEST, 0, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  118. // forward notifcation through to parent
  119. if ( nHitTest == HTCLIENT )
  120. {
  121. wndParent.ScreenToClient( &ptMouse );
  122. wndParent.PostMessage( nMessage, wParam, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  123. }
  124. else
  125. {
  126. switch ( nMessage )
  127. {
  128. case WM_LBUTTONDOWN: wndParent.PostMessage( WM_NCLBUTTONDOWN, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  129. break;
  130. case WM_LBUTTONUP: wndParent.PostMessage( WM_NCLBUTTONUP, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  131. break;
  132. case WM_LBUTTONDBLCLK: wndParent.PostMessage( WM_NCLBUTTONDBLCLK, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  133. break;
  134. case WM_RBUTTONDOWN: wndParent.PostMessage( WM_NCRBUTTONDOWN, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  135. break;
  136. case WM_RBUTTONUP: wndParent.PostMessage( WM_NCRBUTTONUP, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  137. break;
  138. case WM_RBUTTONDBLCLK: wndParent.PostMessage( WM_NCRBUTTONDBLCLK, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  139. break;
  140. case WM_MBUTTONDOWN: wndParent.PostMessage( WM_NCMBUTTONDOWN, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  141. break;
  142. case WM_MBUTTONUP: wndParent.PostMessage( WM_NCMBUTTONUP, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  143. break;
  144. case WM_MBUTTONDBLCLK: wndParent.PostMessage( WM_NCMBUTTONDBLCLK, nHitTest, MAKELPARAM( ptMouse.x, ptMouse.y ) );
  145. break;
  146. }
  147. }
  148. return 0;
  149. }
  150. BOOL OnEraseBkgnd( HDC dc ) 
  151. {
  152. return TRUE;
  153. }
  154. void OnPaint( HDC )
  155. {
  156. CPaintDC dcPaint( m_hWnd );
  157. int nContextState = dcPaint.SaveDC();
  158. CRect rcClient;
  159. GetClientRect( rcClient );
  160. CRect rcTitleTip( rcClient );
  161. if ( m_bShowThemed && CTheme::IsThemingSupported() )
  162. {
  163. CPen penBorder;
  164. penBorder.CreatePen( PS_SOLID, 1, m_rgbBorderOuter );
  165. dcPaint.SelectPen( penBorder );
  166. dcPaint.SelectStockBrush( HOLLOW_BRUSH );
  167. dcPaint.RoundRect( rcTitleTip, CPoint( 5, 5 ) );
  168. rcTitleTip.DeflateRect( 1, 1 );
  169. CPen penInnerBorder;
  170. penInnerBorder.CreatePen( PS_SOLID, 1, m_rgbBorderInner );
  171. dcPaint.SelectPen( penInnerBorder );
  172. dcPaint.RoundRect( rcTitleTip, CPoint( 2, 2 ) );
  173. rcTitleTip.DeflateRect( 1, 1 );
  174. GRADIENT_RECT grdRect = { 0, 1 };
  175. TRIVERTEX triVertext[ 2 ] = {
  176. rcTitleTip.left,
  177. rcTitleTip.top,
  178. GetRValue( m_rgbBackgroundTop ) << 8,
  179. GetGValue( m_rgbBackgroundTop ) << 8,
  180. GetBValue( m_rgbBackgroundTop ) << 8,
  181. 0x0000,
  182. rcTitleTip.right,
  183. rcTitleTip.bottom,
  184. GetRValue( m_rgbBackgroundBottom ) << 8,
  185. GetGValue( m_rgbBackgroundBottom ) << 8,
  186. GetBValue( m_rgbBackgroundBottom ) << 8,
  187. 0x0000
  188. };
  189. dcPaint.GradientFill( triVertext, 2, &grdRect, 1, GRADIENT_FILL_RECT_V );
  190. }
  191. else
  192. {
  193. dcPaint.SetBkColor( m_rgbBackground );
  194. dcPaint.ExtTextOut( rcTitleTip.left, rcTitleTip.top, ETO_OPAQUE, rcTitleTip, _T( "" ), 0, NULL );
  195. CBrush bshTitleFrame;
  196. bshTitleFrame.CreateSolidBrush( m_rgbTextColour );
  197. dcPaint.FrameRect( rcTitleTip, bshTitleFrame );
  198. }
  199. int nTextLength = GetWindowTextLength() + 1;
  200. CString strItemText;
  201. GetWindowText( strItemText.GetBuffer( nTextLength ), nTextLength );
  202. strItemText.ReleaseBuffer();
  203. dcPaint.SelectFont( m_fntTitleFont );
  204. dcPaint.SetTextColor( m_rgbTextColour );
  205. dcPaint.SetBkMode( TRANSPARENT );
  206. CRect rcItemText( rcClient );
  207. rcItemText.OffsetRect( 4, 0 );
  208. dcPaint.DrawText( strItemText, strItemText.GetLength(), rcItemText, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER );
  209. dcPaint.RestoreDC( nContextState );
  210. }
  211. };