TitleTip.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////
  2. // TitleTip.cpp : implementation file
  3. //
  4. // Code taken from www.codeguru.com. - thanks Zafir!
  5. //
  6. // Modifed 10 Apr 1999  Now accepts a LOGFONT pointer and 
  7. //                      a tracking rect in Show(...)  (Chris Maunder)
  8. //         18 Apr 1999  Resource leak in Show fixed by Daniel Gehriger
  9.    
  10. #include "stdafx.h"
  11. #include "gridctrl.h"
  12. #ifndef GRIDCONTROL_NO_TITLETIPS
  13. #include "TitleTip.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CTitleTip
  21. CTitleTip::CTitleTip()
  22. {
  23. // Register the window class if it has not already been registered.
  24. WNDCLASS wndcls;
  25. HINSTANCE hInst = AfxGetInstanceHandle();
  26. if(!(::GetClassInfo(hInst, TITLETIP_CLASSNAME, &wndcls)))
  27. {
  28. // otherwise we need to register a new class
  29. wndcls.style = CS_SAVEBITS;
  30. wndcls.lpfnWndProc = ::DefWindowProc;
  31. wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
  32. wndcls.hInstance = hInst;
  33. wndcls.hIcon = NULL;
  34. wndcls.hCursor = LoadCursor( hInst, IDC_ARROW );
  35. wndcls.hbrBackground = (HBRUSH)(COLOR_INFOBK + 1); 
  36. wndcls.lpszMenuName = NULL;
  37. wndcls.lpszClassName = TITLETIP_CLASSNAME;
  38. if (!AfxRegisterClass(&wndcls))
  39. AfxThrowResourceException();
  40. }
  41. }
  42. CTitleTip::~CTitleTip()
  43. {
  44. }
  45. BEGIN_MESSAGE_MAP(CTitleTip, CWnd)
  46. //{{AFX_MSG_MAP(CTitleTip)
  47. ON_WM_MOUSEMOVE()
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CTitleTip message handlers
  52. BOOL CTitleTip::Create(CWnd * pParentWnd)
  53. {
  54. ASSERT_VALID(pParentWnd);
  55. DWORD dwStyle = WS_BORDER | WS_POPUP; 
  56. DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
  57. m_pParentWnd = pParentWnd;
  58. return CreateEx(dwExStyle, TITLETIP_CLASSNAME, NULL, dwStyle, 
  59.                     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  60.             NULL, NULL, NULL );
  61. }
  62. // Show   - Show the titletip if needed
  63. // rectTitle  - The rectangle within which the original 
  64. //     title is constrained - in client coordinates
  65. // lpszTitleText - The text to be displayed
  66. // xoffset  - Number of pixel that the text is offset from
  67. //    left border of the cell
  68. void CTitleTip::Show(CRect rectTitle, LPCTSTR lpszTitleText, int xoffset /*=0*/,
  69.                      LPRECT lpHoverRect /*=NULL*/,
  70.                      LPLOGFONT lpLogFont /*=NULL*/)
  71. {
  72. ASSERT( ::IsWindow( GetSafeHwnd() ) );
  73.     if (rectTitle.IsRectEmpty())
  74.         return;
  75.     m_rectHover = (lpHoverRect != NULL)? lpHoverRect : rectTitle;
  76. m_pParentWnd->ClientToScreen( m_rectHover );
  77.     ScreenToClient( m_rectHover );
  78. // If titletip is already displayed, don't do anything.
  79. if( IsWindowVisible() ) 
  80. return;
  81. // Do not display the titletip is app does not have focus
  82. if( GetFocus() == NULL )
  83. return;
  84. // Define the rectangle outside which the titletip will be hidden.
  85. // We add a buffer of one pixel around the rectangle
  86. m_rectTitle.top    = -1;
  87. m_rectTitle.left   = -xoffset-1;
  88. m_rectTitle.right  = rectTitle.Width()-xoffset;
  89. m_rectTitle.bottom = rectTitle.Height()+1;
  90. // Determine the width of the text
  91. m_pParentWnd->ClientToScreen( rectTitle );
  92. CClientDC dc(this);
  93. CString strTitle = _T("");
  94.     strTitle += _T(" ");
  95.     strTitle += lpszTitleText; 
  96.     strTitle += _T(" ");
  97. CFont font, *pOldFont = NULL;
  98.     if (lpLogFont)
  99.     {
  100.         font.CreateFontIndirect(lpLogFont);
  101.     pOldFont = dc.SelectObject( &font );
  102.     }
  103.     else
  104.     {
  105.         // use same font as ctrl
  106.     pOldFont = dc.SelectObject( m_pParentWnd->GetFont() );
  107.     }
  108. CSize size = dc.GetTextExtent( strTitle );
  109.     TEXTMETRIC tm;
  110.     dc.GetTextMetrics(&tm);
  111.     size.cx += tm.tmOverhang;
  112. CRect rectDisplay = rectTitle;
  113. rectDisplay.left += xoffset;
  114. rectDisplay.right = rectDisplay.left + size.cx + xoffset;
  115.     
  116.     // Do not display if the text fits within available space
  117.     if( rectDisplay.right > rectTitle.right-xoffset )
  118.     {
  119.         // Show the titletip
  120.         SetWindowPos( &wndTop, rectDisplay.left, rectDisplay.top, 
  121.             rectDisplay.Width(), rectDisplay.Height(), 
  122.             SWP_SHOWWINDOW|SWP_NOACTIVATE );
  123.         
  124.         dc.SetBkMode( TRANSPARENT );
  125.         dc.TextOut( 0, 0, strTitle );
  126.         SetCapture();
  127.     }
  128.     
  129.     dc.SelectObject( pOldFont );
  130. }
  131. void CTitleTip::Hide()
  132. {
  133.    if (!::IsWindow(GetSafeHwnd()))
  134.         return;
  135.     if (GetCapture()->GetSafeHwnd() == GetSafeHwnd())
  136.         ReleaseCapture();
  137. ShowWindow( SW_HIDE );
  138. }
  139. void CTitleTip::OnMouseMove(UINT nFlags, CPoint point) 
  140. {
  141.     if (!m_rectHover.PtInRect(point)) 
  142.     {
  143.         Hide();
  144.         
  145.         // Forward the message
  146.         ClientToScreen( &point );
  147.         CWnd *pWnd = WindowFromPoint( point );
  148.         if ( pWnd == this ) 
  149.             pWnd = m_pParentWnd;
  150.         
  151.         int hittest = (int)pWnd->SendMessage(WM_NCHITTEST,0,MAKELONG(point.x,point.y));
  152.         
  153.         if (hittest == HTCLIENT) {
  154.             pWnd->ScreenToClient( &point );
  155.             pWnd->PostMessage( WM_MOUSEMOVE, nFlags, MAKELONG(point.x,point.y) );
  156.         } else {
  157.             pWnd->PostMessage( WM_NCMOUSEMOVE, hittest, MAKELONG(point.x,point.y) );
  158.         }
  159.     }
  160. }
  161. BOOL CTitleTip::PreTranslateMessage(MSG* pMsg) 
  162. {
  163. CWnd *pWnd;
  164. int hittest;
  165. switch (pMsg->message)
  166. {
  167. case WM_LBUTTONDOWN:
  168. case WM_RBUTTONDOWN:
  169. case WM_MBUTTONDOWN:
  170. {
  171. POINTS pts = MAKEPOINTS( pMsg->lParam );
  172. POINT  point;
  173. point.x = pts.x;
  174. point.y = pts.y;
  175. ClientToScreen( &point );
  176. pWnd = WindowFromPoint( point );
  177. if( pWnd == this ) 
  178. pWnd = m_pParentWnd;
  179. hittest = (int)pWnd->SendMessage(WM_NCHITTEST,0,MAKELONG(point.x,point.y));
  180. if (hittest == HTCLIENT) {
  181. pWnd->ScreenToClient( &point );
  182. pMsg->lParam = MAKELONG(point.x,point.y);
  183. } else {
  184. switch (pMsg->message) {
  185. case WM_LBUTTONDOWN: 
  186. pMsg->message = WM_NCLBUTTONDOWN;
  187. break;
  188. case WM_RBUTTONDOWN: 
  189. pMsg->message = WM_NCRBUTTONDOWN;
  190. break;
  191. case WM_MBUTTONDOWN: 
  192. pMsg->message = WM_NCMBUTTONDOWN;
  193. break;
  194. }
  195. pMsg->wParam = hittest;
  196. pMsg->lParam = MAKELONG(point.x,point.y);
  197. }
  198. Hide();
  199. pWnd->PostMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
  200. return TRUE;
  201. }
  202. case WM_KEYDOWN:
  203. case WM_SYSKEYDOWN:
  204.         Hide();
  205. m_pParentWnd->PostMessage( pMsg->message, pMsg->wParam, pMsg->lParam );
  206. return TRUE;
  207. }
  208. if( GetFocus() == NULL )
  209. {
  210.         Hide();
  211. return TRUE;
  212. }
  213. return CWnd::PreTranslateMessage(pMsg);
  214. }
  215. #endif // GRIDCONTROL_NO_TITLETIPS