XTPSyntaxEditToolTipCtrl.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:5k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditToolTipCtrl.cpp
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. // common includes
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/XTPNotifyConnection.h"
  25. #include "Common/XTPSystemHelpers.h"
  26. #include "Common/XTPSmartPtrInternalT.h"
  27. #include "XTPSyntaxEditToolTipCtrl.h"
  28. // syntax editor includes
  29. #include "XTPSyntaxEditDefines.h"
  30. #include "XTPSyntaxEditStruct.h"
  31. #include "XTPSyntaxEditLexPtrs.h"
  32. #include "XTPSyntaxEditCtrl.h"
  33. #include "XTPSyntaxEditPaintManager.h"
  34. #ifdef _DEBUG
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39. const UINT XTP_TIP_TIMER_ID = 1001;
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CXTPSyntaxEditToolTipCtrl
  42. CXTPSyntaxEditToolTipCtrl::CXTPSyntaxEditToolTipCtrl()
  43. : m_pParentWnd(NULL)
  44. , m_nDelayTime(5000)
  45. {
  46. RegisterWindowClass();
  47. }
  48. CXTPSyntaxEditToolTipCtrl::~CXTPSyntaxEditToolTipCtrl()
  49. {
  50. DestroyWindow();
  51. }
  52. BEGIN_MESSAGE_MAP(CXTPSyntaxEditToolTipCtrl, CWnd)
  53. //{{AFX_MSG_MAP(CXTPSyntaxEditToolTipCtrl)
  54. ON_WM_NCHITTEST_EX()
  55. ON_WM_PAINT()
  56. ON_WM_TIMER()
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. BOOL CXTPSyntaxEditToolTipCtrl::RegisterWindowClass(HINSTANCE hInstance /*= NULL*/)
  60. {
  61. WNDCLASS wndcls;
  62. if (hInstance == NULL) hInstance = AfxGetInstanceHandle();
  63. if (!(::GetClassInfo(hInstance, XTP_EDIT_CLASSNAME_TOOLTIP, &wndcls)))
  64. {
  65. // otherwise we need to register a new class
  66. wndcls.style = CS_VREDRAW | CS_HREDRAW;
  67. wndcls.lpfnWndProc = ::DefWindowProc;
  68. wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
  69. wndcls.hInstance = hInstance;
  70. wndcls.hIcon = NULL;
  71. wndcls.hCursor = ::LoadCursor(0, IDC_ARROW);
  72. wndcls.hbrBackground = (HBRUSH)(COLOR_INFOBK + 1);
  73. wndcls.lpszMenuName = NULL;
  74. wndcls.lpszClassName = XTP_EDIT_CLASSNAME_TOOLTIP;
  75. if (!AfxRegisterClass(&wndcls))
  76. {
  77. AfxThrowResourceException();
  78. return FALSE;
  79. }
  80. }
  81. return TRUE;
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CXTPSyntaxEditToolTipCtrl message handlers
  85. LRESULT CXTPSyntaxEditToolTipCtrl::OnNcHitTest(CPoint point)
  86. {
  87. UNREFERENCED_PARAMETER(point);
  88. return (LRESULT)HTTRANSPARENT;
  89. }
  90. BOOL CXTPSyntaxEditToolTipCtrl::Create(CXTPSyntaxEditCtrl * pParentWnd)
  91. {
  92. ASSERT_VALID(pParentWnd);
  93. m_pParentWnd = pParentWnd;
  94. // Already created?
  95. if (::IsWindow(m_hWnd))
  96. return TRUE;
  97. // first, create a tool tip window
  98. if (!CWnd::CreateEx(WS_EX_TOOLWINDOW, XTP_EDIT_CLASSNAME_TOOLTIP, NULL,
  99. WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS, CXTPEmptyRect(), NULL, 0))
  100. {
  101. TRACE0("Failed to create tooltip window.n");
  102. return FALSE;
  103. }
  104. return TRUE;
  105. }
  106. void CXTPSyntaxEditToolTipCtrl::OnPaint()
  107. {
  108. CPaintDC dc(this);
  109. CXTPClientRect rc(this);
  110. dc.SetBkColor(::GetSysColor(COLOR_INFOBK));
  111. dc.SetTextColor(::GetSysColor(COLOR_INFOTEXT));
  112. CXTPFontDC font(&dc, m_pParentWnd ? m_pParentWnd->GetPaintManager()->GetFontToolTip() : NULL);
  113. CRect rcText(rc);
  114. rcText.left += 3;
  115. rcText.top += 3;
  116. dc.DrawText(m_strToolTipText, rcText,
  117. DT_WORDBREAK | DT_NOPREFIX | DT_EXPANDTABS);
  118. }
  119. void CXTPSyntaxEditToolTipCtrl::ReCalcToolTipRect()
  120. {
  121. CWindowDC dc(NULL);
  122. CXTPFontDC font(&dc, m_pParentWnd ? m_pParentWnd->GetPaintManager()->GetFontToolTip() : NULL);
  123. CRect rcDesktop = XTPMultiMonitor()->GetWorkArea();
  124. CRect rc(0,0,(rcDesktop.right-m_rcHover.left)-10,20);
  125. dc.DrawText(m_strToolTipText, rc,
  126. DT_CALCRECT | DT_WORDBREAK | DT_EXPANDTABS);
  127. m_rcHover.right = m_rcHover.left + rc.Width() + 8;
  128. m_rcHover.bottom = m_rcHover.top + rc.Height() + 8;
  129. MoveWindow(&m_rcHover);
  130. }
  131. void CXTPSyntaxEditToolTipCtrl::Hide()
  132. {
  133. if (!m_hWnd)
  134. return;
  135. // stop existing timer.
  136. KillTimer(XTP_TIP_TIMER_ID);
  137. if (::IsWindowVisible(m_hWnd))
  138. {
  139. ShowWindow(SW_HIDE);
  140. }
  141. }
  142. void CXTPSyntaxEditToolTipCtrl::Activate(const CString& strText)
  143. {
  144. BOOL bVisible = ::IsWindowVisible(m_hWnd);
  145. // stop existing timer.
  146. KillTimer(XTP_TIP_TIMER_ID);
  147. // hide the window if the tip text has changed.
  148. if (bVisible && (m_strToolTipText != strText))
  149. {
  150. ShowWindow(SW_HIDE);
  151. }
  152. // set the tip text.
  153. m_strToolTipText = strText;
  154. if (!bVisible)
  155. {
  156. ReCalcToolTipRect();
  157. ShowWindow(SW_SHOWNA);
  158. Invalidate();
  159. }
  160. // set timer.
  161. SetTimer(XTP_TIP_TIMER_ID, m_nDelayTime, NULL);
  162. }
  163. void CXTPSyntaxEditToolTipCtrl::OnTimer(UINT_PTR nIDEvent)
  164. {
  165. if (nIDEvent == XTP_TIP_TIMER_ID)
  166. {
  167. Hide();
  168. return;
  169. }
  170. CWnd::OnTimer(nIDEvent);
  171. }