HyperLinker.cpp
上传用户:yangb198
上传日期:2021-03-29
资源大小:14k
文件大小:5k
源码类别:

Static控件

开发平台:

Visual C++

  1. // HyperLinker.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "HyperLinkerDemo.h"
  5. #include "HyperLinker.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CHyperLinker
  13. CHyperLinker::CHyperLinker()
  14. {
  15. m_bAboveControl = FALSE;
  16. m_bUnderLine = FALSE;
  17. m_bVisited = FALSE;
  18. }
  19. CHyperLinker::~CHyperLinker()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CHyperLinker, CStatic)
  23. //{{AFX_MSG_MAP(CHyperLinker)
  24. ON_WM_LBUTTONDOWN()
  25. ON_WM_SETCURSOR()
  26. ON_WM_MOUSEMOVE()
  27. ON_WM_CTLCOLOR_REFLECT()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CHyperLinker message handlers
  32. void CHyperLinker::OnLButtonDown(UINT nFlags, CPoint point) 
  33. {
  34. // TODO: Add your message handler code here and/or call default
  35. OpenUsingShellExecute();                 // shell外部程序
  36. m_bVisited = TRUE;                   // 表示应经点击过超级链接文本框
  37.     Invalidate();               // 调用CtrlColor重绘文本
  38. CStatic::OnLButtonDown(nFlags, point);
  39. }
  40. BOOL CHyperLinker::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  41. {
  42. // TODO: Add your message handler code here and/or call default
  43. HCURSOR LinkCurlor = ::AfxGetApp()->LoadCursor(IDC_CUR_HAND);
  44. ::SetCursor(LinkCurlor);
  45.     return TRUE;
  46. return CStatic::OnSetCursor(pWnd, nHitTest, message);
  47. }
  48. void CHyperLinker::OnMouseMove(UINT nFlags, CPoint point) 
  49. {
  50. // TODO: Add your message handler code here and/or call default
  51. CRect rect;
  52. GetClientRect(rect);        // 得到当前文本框的矩形区域
  53. static BOOL bIsIn = FALSE;       // 判断前一次鼠标是否已经在文本框区域
  54. if (rect.PtInRect(point))   // 在区域内
  55. {
  56. m_bAboveControl = TRUE;      // 记录鼠标已经停留在超级链接文本框的上方
  57. if (!bIsIn)           // 如果是第一次停留,则用其他颜色重绘文本
  58. {
  59. SetCapture();   // 设置鼠标捕获
  60. bIsIn = TRUE;
  61. Invalidate();     // 调用CtrlColor重绘文本
  62. }
  63. }
  64. else
  65. {
  66. m_bAboveControl = FALSE;      // 记录鼠标不在超级链接文本框的上方
  67. if (bIsIn)             // 如果是第一次离开区域,则用其他颜色重绘文本
  68. {
  69. ReleaseCapture();   // 释放鼠标捕获
  70. bIsIn = FALSE;
  71. Invalidate();               // 调用CtrlColor重绘文本
  72. }
  73.     }
  74. CStatic::OnMouseMove(nFlags, point);
  75. }
  76. HBRUSH CHyperLinker::CtlColor(CDC* pDC, UINT nCtlColor) 
  77. {
  78. // TODO: Change any attributes of the DC here
  79. ASSERT(nCtlColor == CTLCOLOR_STATIC);
  80. DWORD dwStyle = GetStyle();
  81. if (!(dwStyle & SS_NOTIFY))
  82. {
  83. ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY);
  84. }   
  85. HBRUSH hbr = NULL;
  86. if ((dwStyle & 0xFF) <= SS_RIGHT)
  87. {
  88. // modify the font to be underline
  89. if (!((HFONT)m_Font))
  90. {
  91. LOGFONT lf;
  92. GetFont()->GetObject(sizeof(lf), &lf);
  93. lf.lfUnderline = m_bUnderLine;
  94. m_Font.CreateFontIndirect(&lf);
  95. }
  96. pDC->SelectObject(&m_Font);
  97. // set the text color
  98. if (m_bVisited)
  99. {
  100. pDC->SetTextColor(m_VisitedColor);
  101. }
  102. else
  103. {
  104. if (m_bAboveControl)
  105. {
  106. pDC->SetTextColor(m_CoverColor);
  107. }
  108. else
  109. {
  110. pDC->SetTextColor(m_InitColor);
  111. }
  112. }
  113. pDC->SetBkMode(TRANSPARENT);
  114. hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
  115.     }
  116. // TODO: Return a non-NULL brush if the parent's handler should not be called
  117. return hbr;
  118. }
  119. void CHyperLinker::SetAttrbute(CString url, COLORREF InitColor, COLORREF VisitedColor,    
  120.    COLORREF CoverColor, BOOL bUnderLine)    
  121. {
  122. m_sURL = url;
  123. m_InitColor = InitColor;
  124. m_VisitedColor = VisitedColor;
  125. m_CoverColor = CoverColor;
  126. m_bUnderLine = bUnderLine;
  127. }
  128. BOOL CHyperLinker::OpenUsingShellExecute()
  129. {
  130. HINSTANCE hRun = ShellExecute(GetParent()->GetSafeHwnd(),
  131. _T("open"), m_sURL, NULL, NULL, SW_SHOW);
  132. if((int)hRun <= 32)
  133. {
  134. AfxMessageBox(_T("提供的超级链接或者指定的文件无法执行"), MB_OK, 0);
  135. return FALSE;
  136. }
  137. return TRUE;
  138. }
  139. void CHyperLinker::PreSubclassWindow()
  140. {
  141. // TODO: Add your specialized code here and/or call the base class
  142. DWORD dwStyle = GetStyle();
  143. ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY); // 设置动态窗口属性
  144. CStatic::PreSubclassWindow();
  145. }
  146. void CHyperLinker::SetFont(CFont *font)
  147. {
  148. // 设置字体
  149. memcpy(&m_Font, font, sizeof(CFont));
  150. // 根据字体的长度和宽度设置静态框的长度和宽度
  151. CDC *pDC = GetDC();
  152. CFont *pOldfont = pDC->SelectObject(&m_Font);
  153. CString str;
  154. GetWindowText(str);     
  155. CSize size = pDC->GetTextExtent(str, str.GetLength());
  156. SetWindowPos(NULL, 0, 0, size.cx, size.cy, SWP_NOMOVE);
  157. pDC->SelectObject(pOldfont);
  158. ReleaseDC(pDC);
  159. }