Link.cpp
上传用户:qdzhkyjx
上传日期:2013-04-04
资源大小:43k
文件大小:3k
源码类别:

词法分析

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "link.h"
  3. #define TIP_ID 1
  4. CLink::CLink()
  5. {
  6.     m_bOver      = false; 
  7. m_hLinkCursor=NULL; //初值设置为NULL,这样如果没有在程序中设置该值,就会使用默认的手形光标
  8. }
  9. CLink::~CLink()
  10. {}
  11. /////////////////////////////////////////////////////////////////////////////
  12. BOOL CLink::DestroyWindow() 
  13. {
  14.     KillTimer(1);
  15. return CStatic::DestroyWindow();
  16. }
  17. BOOL CLink::PreTranslateMessage(MSG* pMsg) 
  18. {
  19.     m_ToolTip.RelayEvent(pMsg);
  20.     return CStatic::PreTranslateMessage(pMsg);
  21. }
  22. void CLink::PreSubclassWindow() 
  23. {
  24.     DWORD dwStyle = GetStyle();  //修改属性,使之可接受消息
  25.     ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
  26.     
  27.     SetDefaultCursor();     //设置默认光标为手形光标
  28.    
  29. CRect rect; 
  30.     GetClientRect(rect);
  31.     m_ToolTip.Create(this);
  32. m_ToolTip.SetDelayTime(100);
  33. m_ToolTip.SetMaxTipWidth(200);
  34.     m_ToolTip.AddTool(this, "", rect, TIP_ID);    CStatic::PreSubclassWindow();
  35. }
  36. BEGIN_MESSAGE_MAP(CLink, CStatic)
  37.     //{{AFX_MSG_MAP(CLink)
  38.     ON_WM_CTLCOLOR_REFLECT()
  39.     ON_WM_SETCURSOR()
  40.     ON_WM_MOUSEMOVE()
  41. ON_WM_TIMER()
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. HBRUSH CLink::CtlColor(CDC* pDC, UINT nCtlColor) 
  46. {
  47.     if (m_bOver)
  48.         pDC->SetTextColor(RGB(255,   0,   0));
  49.     else
  50.         pDC->SetTextColor( RGB(  0,   0, 238));
  51.     pDC->SetBkMode(TRANSPARENT);   //设置背景是透明的
  52.     return (HBRUSH)GetStockObject(NULL_BRUSH);
  53. }
  54. void CLink::OnMouseMove(UINT nFlags, CPoint point) 
  55. m_bOver = true;
  56. Invalidate();
  57. SetTimer(1, 100, NULL); //设置一个定时器,用于设置鼠标离开时的颜色
  58.     CStatic::OnMouseMove(nFlags, point);
  59. }
  60. void CLink::OnTimer(UINT nIDEvent) 
  61. {
  62.     CPoint pt(::GetMessagePos());
  63.     ScreenToClient(&pt);
  64.     CRect rc;
  65.     GetClientRect(rc);
  66.     if (!rc.PtInRect(pt))
  67.     {
  68.         m_bOver = false;
  69.         KillTimer(1);        
  70.         Invalidate();
  71.     }    
  72. CStatic::OnTimer(nIDEvent);
  73. }
  74. BOOL CLink::OnSetCursor(CWnd* /*pWnd*/, UINT /*nHitTest*/, UINT /*message*/) 
  75. {
  76.     if (m_hLinkCursor)  //如果设置了光标,就使用新设置的 光标
  77.     {
  78.         ::SetCursor(m_hLinkCursor);
  79.         return true;
  80.     }
  81.     return false;
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. void CLink::SetToolTipText(CString str)
  85. {
  86. m_ToolTip.UpdateTipText(str,this,TIP_ID);
  87. }
  88. void CLink::SetLinkCursor(HCURSOR hCursor)
  89.     m_hLinkCursor = hCursor;
  90.     if (m_hLinkCursor == NULL)
  91.         SetDefaultCursor();
  92. }
  93. void CLink::SetDefaultCursor()   //从winhlp32.exe中提取手形光标,用做默认的光标
  94. {    
  95. CString str;
  96. ::GetWindowsDirectory(str.GetBuffer(MAX_PATH), MAX_PATH);
  97. str.ReleaseBuffer();
  98. str += _T("\winhlp32.exe");
  99. HMODULE hModule = ::LoadLibrary(str);
  100. if (hModule) 
  101. {
  102. HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
  103. if (hHandCursor)
  104. m_hLinkCursor =CopyCursor(hHandCursor);
  105. }
  106. FreeLibrary(hModule);
  107. }