TOOLTIPWND.CPP
上传用户:lvjun8202
上传日期:2013-04-30
资源大小:797k
文件大小:8k
源码类别:

SNMP编程

开发平台:

C/C++

  1. // ToolTipWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ToolTipWnd.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CToolTipWnd
  12. CToolTipWnd::CToolTipWnd()
  13. {
  14. lpWndCls = AfxRegisterWndClass(0);
  15. //Defaults
  16. m_bMouseIn = false;
  17. m_bStuck = false;
  18. m_iWidth = 120;
  19. m_iHeight = 60;
  20. m_clrBkColor = RGB(249,254,188); //light yellow
  21. m_clrFrameColor = RGB(0,0,255);  //blue
  22. m_clrTextColor = RGB(0,0,0);  //black
  23. m_iFontHeight = 14;
  24. m_strFontName = "Arial";
  25. m_rcCurrFit = CRect(0,0,0,0);
  26. }
  27. CToolTipWnd::~CToolTipWnd()
  28. {
  29. BTOOLINFO *stToolInfo;
  30. CWnd *pWnd;
  31. for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
  32. {
  33. m_ToolPtr.GetNextAssoc(pos, (void *&)pWnd, (void*&) stToolInfo);
  34. delete stToolInfo;
  35. }
  36. m_ToolPtr.RemoveAll();
  37. }
  38. BEGIN_MESSAGE_MAP(CToolTipWnd, CWnd)
  39. //{{AFX_MSG_MAP(CToolTipWnd)
  40. ON_WM_PAINT()
  41. ON_WM_CREATE()
  42. ON_WM_TIMER()
  43. ON_WM_SHOWWINDOW()
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CToolTipWnd message handlers
  48. BOOL CToolTipWnd::Create(CWnd* pParentWnd) 
  49. {
  50. BOOL bRet = CWnd::CreateEx(NULL, lpWndCls, NULL,
  51. WS_POPUP, 0, 0, m_iWidth, m_iHeight,
  52. pParentWnd->GetSafeHwnd(), NULL, NULL);
  53. m_hParentWnd = pParentWnd->GetSafeHwnd();
  54. if(bRet)
  55. SetOwner(pParentWnd);
  56. return bRet;
  57. }
  58. void CToolTipWnd::OnPaint() 
  59. {
  60. CPaintDC dc(this); // device context for painting
  61. CRect rectCl;
  62. GetClientRect(&rectCl);
  63. CRgn rgnComb;
  64. rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  65. int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
  66. if(iRetComb==ERROR)
  67. {
  68. AfxMessageBox("ERROR in Combining Region");
  69. return;
  70. }
  71. CBrush pBrush;
  72. pBrush.CreateSolidBrush(m_clrFrameColor);
  73. CBrush pBrush1;
  74. pBrush1.CreateSolidBrush(m_clrBkColor);
  75. dc.FillRgn( &rgnComb, &pBrush1);
  76. dc.FrameRgn(&rgnComb, &pBrush, 2, 1);
  77. dc.SetBkMode(TRANSPARENT);
  78. dc.SetTextColor(m_clrTextColor);
  79. CFont *pFont = dc.SelectObject(&m_fontText);
  80. //dc.Rectangle(&m_RectText);
  81. CSize czTextWidth = dc.GetTextExtent(m_strText);
  82. if( czTextWidth.cx < m_RectText.Width())
  83. dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  84. else
  85. dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_WORDBREAK);
  86. dc.SelectObject(pFont);
  87. }
  88. int CToolTipWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  89. {
  90. if (CWnd::OnCreate(lpCreateStruct) == -1)
  91. return -1;
  92. CRect rectCl;
  93. GetClientRect(&rectCl);
  94. int x=0, y=0;
  95. CRect rectTemp;
  96. rectTemp = rectCl;
  97. rectTemp.left = rectTemp.left + 10;
  98. x = (int)( (float)((float)rectTemp.Width() / 2.0) / 1.41421);
  99. y = (int)( (float)((float)rectTemp.Height() / 2.0) / 1.41421);
  100. m_RectText.top = ( (rectTemp.Height() / 2) - y);
  101. m_RectText.left = ( (rectTemp.Width() / 2) - x) + 10;
  102. m_RectText.right = ( (rectTemp.Width() / 2) + x) + 10;
  103. m_RectText.bottom = ( (rectTemp.Height() / 2) + y);
  104. rgn.m_hObject = NULL;
  105. rgnTri.m_hObject = NULL;
  106. rgnComb.m_hObject = NULL;
  107. BOOL bRegRet = rgn.CreateEllipticRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  108. CPoint ptTri[3];
  109. ptTri[0].x = rectCl.left;
  110. ptTri[0].y = (rectCl.bottom / 2) - 10;
  111. ptTri[1].x = rectCl.left + 15;
  112. ptTri[1].y = (rectCl.bottom / 2) - 5;
  113. ptTri[2].x = rectCl.left + 15;
  114. ptTri[2].y = (rectCl.bottom / 2) + 5;
  115. ptTri[3].x = rectCl.left;
  116. ptTri[3].y = (rectCl.bottom / 2) - 10;
  117. BOOL bRegTriRet = rgnTri.CreatePolygonRgn(ptTri, 3, ALTERNATE);
  118. rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
  119. int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
  120. if(iRetComb == ERROR)
  121. {
  122. AfxMessageBox("ERROR in Combining Region");
  123. return -1;
  124. }
  125. int bRgnWnd = SetWindowRgn(rgnComb.operator HRGN( ), TRUE);
  126. // m_fontText.CreateFont(m_iFontHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,m_strFontName);
  127. m_fontText.CreateStockObject(DEFAULT_GUI_FONT) ||
  128. m_fontText.CreateStockObject(SYSTEM_FONT);
  129. /* BOOL b = m_wndAlert.Create(NULL,"1234",WS_CHILD|WS_VISIBLE,CRect(50,2-0,200,200),this,1001,NULL);
  130. if(m_wndAlert.Load("green.gif"))
  131. {
  132. m_wndAlert.put_AutoSize(TRUE);
  133. m_wndAlert.Play();
  134. }
  135. */ return 0;
  136. }
  137. void CToolTipWnd::RelayEvent(LPMSG lpMsg)
  138. {
  139. if(GetSafeHwnd() == NULL)
  140. return;
  141. switch(lpMsg->message) 
  142. {
  143. case WM_KEYDOWN:
  144. if(IsWindowVisible())
  145. {
  146. ShowWindow(SW_HIDE);
  147. }
  148. break;
  149. case WM_LBUTTONDOWN:
  150. case WM_RBUTTONDOWN:
  151. if(IsWindowVisible())
  152. {
  153. ShowWindow(SW_HIDE);
  154. }
  155. break;
  156. case WM_MOUSEMOVE:
  157. {
  158. CWnd *pFocusWnd = AfxGetApp()->m_pMainWnd->GetFocus();
  159. if(pFocusWnd==NULL)
  160. {
  161. break;
  162. }
  163. CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);
  164. CWnd* pWndOwner = GetOwner();
  165. if(pWndOwner == NULL || pWndOwner != pWnd)
  166. {
  167. break;
  168. }
  169. CPoint pt;
  170. pt.x = lpMsg->pt.x;
  171. pt.y = lpMsg->pt.y;
  172. m_ptCur = pt;
  173. TOOLINFO ti;
  174. if(!m_bMouseIn)
  175. {
  176. if(pWnd->OnToolHitTest(pt,&ti) != -1)
  177. {
  178. m_rcCurrFit = ti.rect;
  179. // SetTimer(1,500,NULL);
  180. SetTimer(2,6000,NULL);
  181. if(m_bStuck && IsWindowVisible())
  182. {
  183. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  184. ShowWindow(SW_SHOWNOACTIVATE);
  185. }
  186. m_bMouseIn = true;
  187. m_clrTextColor = ti.uFlags; 
  188. m_strText = ti.lpszText; 
  189. // break;
  190. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  191. ShowWindow(SW_SHOWNOACTIVATE);
  192. // for(int i = 0; i<m_iHeight+10; i += 10)
  193. // {
  194. // MoveWindow(m_ptCur.x,m_ptCur.y,i*m_iWidth/m_iHeight,i);
  195. // OnPaint();
  196. /// Sleep(10);
  197. // }
  198. break;
  199. }
  200. }
  201. else
  202. {
  203. if(pWnd->OnToolHitTest(pt,&ti) == -1)
  204. {
  205. // KillTimer(1);
  206. KillTimer(2);
  207. }
  208. /* if(m_bStuck && IsWindowVisible())
  209. {
  210. SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  211. ShowWindow(SW_SHOWNOACTIVATE);
  212. }
  213. */
  214. if(!m_rcCurrFit.PtInRect(pt))
  215. {
  216. m_bMouseIn = false;
  217. ShowWindow(SW_HIDE);
  218. }
  219. break;
  220. }
  221. }
  222. break; //WM_MOUSEMOVE
  223. }
  224.  
  225. }
  226. void CToolTipWnd::AddTool(CWnd *pWnd, CString strText, COLORREF clrTextColor)
  227. {
  228. BTOOLINFO *stToolInfo;
  229. if(!m_ToolPtr.Lookup( pWnd, ( void*& )  stToolInfo))
  230. {
  231. stToolInfo = new BTOOLINFO;
  232. stToolInfo->hwndTool = pWnd->GetSafeHwnd();
  233. stToolInfo->strToolText = strText;
  234. if(clrTextColor==NULL)
  235. stToolInfo->clrToolTextClr = m_clrTextColor;
  236. else
  237. stToolInfo->clrToolTextClr = clrTextColor;
  238. m_ToolPtr.SetAt(pWnd, stToolInfo);
  239. }
  240. }
  241. void CToolTipWnd::OnTimer(UINT nIDEvent) 
  242. {
  243. // TODO: Add your message handler code here and/or call default
  244. if(nIDEvent == 1)
  245. {
  246. CWnd* pWndOwner = GetOwner();
  247. if(pWndOwner != NULL)
  248. {
  249. CPoint pt;
  250. GetCursorPos(&pt);
  251. CRect rc;
  252. pWndOwner->GetClientRect(rc);
  253. pWndOwner->ClientToScreen(&rc);
  254. if(rc.PtInRect(pt))
  255. {
  256. m_bMouseIn = true;
  257. SetWindowPos(&wndTop,m_ptCur.x,m_ptCur.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
  258. ShowWindow(SW_SHOWNOACTIVATE);
  259. for(int i = 0; i<m_iHeight+10; i += 10)
  260. {
  261. MoveWindow(m_ptCur.x,m_ptCur.y,i*m_iWidth/m_iHeight,i);
  262. OnPaint();
  263. Sleep(10);
  264. }
  265. }
  266. }
  267. }
  268. else
  269. {
  270. ShowWindow(SW_HIDE);
  271. }
  272. KillTimer(nIDEvent);
  273. CWnd::OnTimer(nIDEvent);
  274. }
  275. BOOL CToolTipWnd::PreTranslateMessage(MSG* pMsg) 
  276. {
  277. // TODO: Add your specialized code here and/or call the base class
  278. if (pMsg->message == WM_KEYDOWN ||
  279.     pMsg->message == WM_SYSKEYDOWN ||
  280.     pMsg->message == WM_LBUTTONDOWN ||
  281.     pMsg->message == WM_RBUTTONDOWN ||
  282.     pMsg->message == WM_MBUTTONDOWN ||
  283.     pMsg->message == WM_NCLBUTTONDOWN ||
  284.     pMsg->message == WM_NCRBUTTONDOWN ||
  285.     pMsg->message == WM_NCMBUTTONDOWN)
  286. {
  287. ShowWindow(SW_HIDE);
  288. return TRUE; // message handled here
  289. }
  290. return CWnd::PreTranslateMessage(pMsg);
  291. }
  292. void CToolTipWnd::OnShowWindow(BOOL bShow, UINT nStatus) 
  293. {
  294. CWnd::OnShowWindow(bShow, nStatus);
  295. // TODO: Add your message handler code here
  296. // if(m_wndAlert.GetSafeHwnd())
  297. // m_wndAlert.ShowWindow(bShow);
  298. }