ToolTipWnd.cpp
上传用户:yffx2008
上传日期:2014-10-12
资源大小:12414k
文件大小:7k
源码类别:

交通/航空行业

开发平台:

Visual C++

  1. // ToolTipWnd.cpp: implementation of the CToolTipWnd class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GpsSC.h"
  6. #include "ToolTipWnd.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CToolTipWnd::CToolTipWnd()
  16. {
  17. lpWndCls = AfxRegisterWndClass(0);
  18. //Defaults
  19. m_bMouseIn = false;
  20. m_bStuck = false;
  21. m_iWidth = 100;
  22. m_iHeight = 60;
  23. m_clrBkColor = RGB(249,254,188); //light yellow
  24. m_clrFrameColor = RGB(0,0,255);  //blue
  25. m_clrTextColor = RGB(0,0,0);  //black
  26. m_iFontHeight = 14;
  27. m_strFontName = "Arial";
  28. pCurrwnd = NULL;
  29. }
  30. CToolTipWnd::~CToolTipWnd()
  31. {
  32. BTOOLINFO *stToolInfo;
  33. CWnd *pWnd;
  34. for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
  35. {
  36. m_ToolPtr.GetNextAssoc(pos, (void *&)pWnd, (void*&) stToolInfo);
  37. delete stToolInfo;
  38. }
  39. m_ToolPtr.RemoveAll();
  40. }
  41. BEGIN_MESSAGE_MAP(CToolTipWnd, CWnd)
  42. //{{AFX_MSG_MAP(CToolTipWnd)
  43. ON_WM_PAINT()
  44. ON_WM_CREATE()
  45. //}}AFX_MSG_MAP
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CToolTipWnd message handlers
  49. BOOL CToolTipWnd::Create(CWnd* pParentWnd) 
  50. {
  51. BOOL bRet = CWnd::CreateEx(NULL, lpWndCls, NULL,
  52. WS_POPUP, 0, 0, m_iWidth, m_iHeight,
  53. pParentWnd->GetSafeHwnd(), NULL, NULL);
  54. m_hParentWnd = pParentWnd->GetSafeHwnd();
  55. if(bRet)
  56. SetOwner(pParentWnd);
  57. return bRet;
  58. }
  59. void CToolTipWnd::OnPaint() 
  60. {
  61. CPaintDC dc(this); // device context for painting
  62. CRect rectCl;
  63. GetClientRect(&rectCl);
  64. CRgn rgnComb;
  65. rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  66. int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
  67. if(iRetComb==ERROR)
  68. {
  69. AfxMessageBox("ERROR in Combining Region");
  70. return;
  71. }
  72. CBrush pBrush;
  73. pBrush.CreateSolidBrush(m_clrFrameColor);
  74. CBrush pBrush1;
  75. pBrush1.CreateSolidBrush(m_clrBkColor);
  76. dc.FillRgn( &rgnComb, &pBrush1);
  77. dc.FrameRgn(&rgnComb, &pBrush, 2, 1);
  78. dc.SetBkMode(TRANSPARENT);
  79. dc.SetTextColor(m_clrTextColor);
  80. CFont *pFont = dc.SelectObject(&m_fontText);
  81. //dc.Rectangle(&m_RectText);
  82. CSize czTextWidth = dc.GetTextExtent(m_strText);
  83. if( czTextWidth.cx < m_RectText.Width())
  84. dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  85. else
  86. dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_WORDBREAK);
  87. dc.SelectObject(pFont);
  88. }
  89. int CToolTipWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  90. {
  91. if (CWnd::OnCreate(lpCreateStruct) == -1)
  92. return -1;
  93. CRect rectCl;
  94. GetClientRect(&rectCl);
  95. int x=0, y=0;
  96. CRect rectTemp;
  97. rectTemp = rectCl;
  98. rectTemp.left = rectTemp.left + 10;
  99. x = (int)( (float)((float)rectTemp.Width() / 2.0) / 1.41421);
  100. y = (int)( (float)((float)rectTemp.Height() / 2.0) / 1.41421);
  101. m_RectText.top = ( (rectTemp.Height() / 2) - y);
  102. m_RectText.left = ( (rectTemp.Width() / 2) - x) + 10;
  103. m_RectText.right = ( (rectTemp.Width() / 2) + x) + 10;
  104. m_RectText.bottom = ( (rectTemp.Height() / 2) + y);
  105. rgn.m_hObject = NULL;
  106. rgnTri.m_hObject = NULL;
  107. rgnComb.m_hObject = NULL;
  108. BOOL bRegRet = rgn.CreateEllipticRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  109. CPoint ptTri[3];
  110. ptTri[0].x = rectCl.left;
  111. ptTri[0].y = (rectCl.bottom / 2) - 10;
  112. ptTri[1].x = rectCl.left + 15;
  113. ptTri[1].y = (rectCl.bottom / 2) - 5;
  114. ptTri[2].x = rectCl.left + 15;
  115. ptTri[2].y = (rectCl.bottom / 2) + 5;
  116. ptTri[3].x = rectCl.left;
  117. ptTri[3].y = (rectCl.bottom / 2) - 10;
  118. BOOL bRegTriRet = rgnTri.CreatePolygonRgn(ptTri, 3, ALTERNATE);
  119. rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  120. int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
  121. if(iRetComb == ERROR)
  122. {
  123. AfxMessageBox("ERROR in Combining Region");
  124. return -1;
  125. }
  126. int bRgnWnd = SetWindowRgn(rgnComb.operator HRGN( ), TRUE);
  127. m_fontText.CreateFont(m_iFontHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,m_strFontName);
  128. return 0;
  129. }
  130. void CToolTipWnd::RelayEvent(LPMSG lpMsg)
  131. {
  132. switch(lpMsg->message) 
  133. {
  134. case WM_KEYDOWN:
  135. if(IsWindowVisible())
  136. {
  137. ShowWindow(SW_HIDE);
  138. }
  139. break;
  140. case WM_LBUTTONDOWN:
  141. case WM_RBUTTONDOWN:
  142. if(IsWindowVisible())
  143. {
  144. ShowWindow(SW_HIDE);
  145. }
  146. break;
  147. case WM_MOUSEMOVE:
  148. {
  149. CWnd *pFocusWnd = AfxGetApp()->m_pMainWnd->GetFocus();
  150. if(pFocusWnd==NULL)
  151. break;
  152. CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);
  153. HWND hWndTemp = ::GetParent(lpMsg->hwnd);
  154. CPoint pt;
  155. pt.x = lpMsg->pt.x;
  156. pt.y = lpMsg->pt.y;
  157. BTOOLINFO *stToolInfo;
  158. CWnd *pBToolWnd;
  159. for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
  160. {
  161. m_ToolPtr.GetNextAssoc(pos, (void *&)pBToolWnd, (void*&) stToolInfo);
  162. if(!m_bMouseIn)
  163. {
  164. if(lpMsg->hwnd == stToolInfo->hwndTool)
  165. {
  166. if(m_bStuck && IsWindowVisible())
  167. {
  168. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  169. ShowWindow(SW_SHOWNOACTIVATE);
  170. }
  171. m_bMouseIn = true;
  172. m_clrTextColor = stToolInfo->clrToolTextClr; 
  173. m_strText = stToolInfo->strToolText; 
  174. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  175. ShowWindow(SW_SHOWNOACTIVATE);
  176. pCurrwnd = stToolInfo->hwndTool;
  177. break;
  178. }
  179. }
  180. else
  181. {
  182. CRect rect;
  183. ::GetWindowRect(pCurrwnd, &rect);
  184. if(m_bStuck && IsWindowVisible())
  185. {
  186. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  187. ShowWindow(SW_SHOWNOACTIVATE);
  188. }
  189. CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);
  190. CWnd *WndPt = pWnd->WindowFromPoint(lpMsg->pt);
  191. if(WndPt->GetSafeHwnd() != pCurrwnd)
  192. {
  193. m_bMouseIn = false;
  194. ShowWindow(SW_HIDE);
  195. }
  196. break;
  197. }
  198. }
  199. }
  200. break; //WM_MOUSEMOVE
  201. }
  202.  
  203. }
  204. void CToolTipWnd::AddTool(CWnd *pWnd, CString strText, COLORREF clrTextColor)
  205. {
  206. BTOOLINFO *stToolInfo;
  207. if(!m_ToolPtr.Lookup( pWnd, ( void*& )  stToolInfo))
  208. {
  209. stToolInfo = new BTOOLINFO;
  210. stToolInfo->hwndTool = pWnd->GetSafeHwnd();
  211. stToolInfo->strToolText = strText;
  212. if(clrTextColor==NULL)
  213. stToolInfo->clrToolTextClr = m_clrTextColor;
  214. else
  215. stToolInfo->clrToolTextClr = clrTextColor;
  216. m_ToolPtr.SetAt(pWnd, stToolInfo);
  217. }
  218. }