HyperlinkStatic.cpp
Upload User: dzyhzl
Upload Date: 2019-04-29
Package Size: 56270k
Code Size: 3k
Development Platform:

C/C++

  1. // HyperlinkStatic.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "HyperlinkStatic.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CHyperlinkStatic
  12. CHyperlinkStatic::CHyperlinkStatic()
  13. {
  14. _strCaption = _strHyperlink = _T("");  
  15. _bMouseInControl = _bCreateFont = _bGetCaptionSize = false;
  16. _hHandCursor = ::LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW));
  17. _hArrowCursor = ::LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW));
  18. m_FontColor = RGB(0,0,255);
  19. }
  20. CHyperlinkStatic::~CHyperlinkStatic()
  21. {
  22. }
  23. BEGIN_MESSAGE_MAP(CHyperlinkStatic, CStatic)
  24. //{{AFX_MSG_MAP(CHyperlinkStatic)
  25. ON_WM_LBUTTONDOWN()
  26. ON_WM_PAINT()
  27. ON_WM_DESTROY()
  28. ON_WM_MOUSEMOVE()
  29. //}}AFX_MSG_MAP
  30. ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CHyperlinkStatic message handlers
  34. void CHyperlinkStatic::SetHyperlink(CString strHyperlink)
  35. {
  36. _strHyperlink = strHyperlink;
  37. }
  38. void CHyperlinkStatic::SetCaption(CString strCaption)
  39. {
  40. _strCaption = strCaption;
  41. _bGetCaptionSize = false;
  42. }
  43. void CHyperlinkStatic::OnLButtonDown(UINT nFlags, CPoint point) 
  44. {
  45. if ( _bGetCaptionSize == false )
  46. GetCaptionSize();
  47. if (InCaptionRange(point))
  48. ShellExecute(0, "open", _strHyperlink, 0, 0, SW_SHOWNORMAL);
  49. CStatic::OnLButtonDown(nFlags, point);
  50. }
  51. void CHyperlinkStatic::OnPaint() 
  52. {
  53. if ( _bCreateFont == false )
  54. CreateFont();
  55. CPaintDC dc(this);
  56. CFont *pOldFont = (CFont*)dc.SelectObject(&_fontCaption);
  57. dc.SetBkMode(TRANSPARENT);
  58. dc.SetTextColor(m_FontColor);
  59. dc.TextOut(0, 0, _strCaption);
  60. dc.SelectObject(pOldFont);
  61. }
  62. void CHyperlinkStatic::OnDestroy() 
  63. {
  64. CStatic::OnDestroy();
  65. _fontCaption.DeleteObject();
  66. }
  67. void CHyperlinkStatic::PreSubclassWindow() 
  68. {
  69. ModifyStyle(0, SS_NOTIFY, TRUE);
  70. GetWindowText(_strCaption);
  71. _bGetCaptionSize = false;
  72. CStatic::PreSubclassWindow();
  73. }
  74. LRESULT CHyperlinkStatic::OnMouseLeave(WPARAM wParam, LPARAM lParam)
  75. {
  76. _bMouseInControl = false;
  77. ::SetCursor(_hArrowCursor);
  78. return 0;
  79. }
  80. void CHyperlinkStatic::OnMouseMove(UINT nFlags, CPoint point) 
  81. {
  82. if ( _bMouseInControl == false ) {
  83. //Track the mouse leave event
  84. TRACKMOUSEEVENT tme;
  85. tme.cbSize = sizeof(tme);
  86.         tme.hwndTrack = GetSafeHwnd();
  87.         tme.dwFlags = TME_LEAVE;        
  88. _TrackMouseEvent(&tme);
  89. _bMouseInControl = true;
  90. }
  91. else {
  92. if ( _bGetCaptionSize == false )
  93. GetCaptionSize();
  94. ::SetCursor((InCaptionRange(point))?_hHandCursor:_hArrowCursor);
  95. }
  96. CStatic::OnMouseMove(nFlags, point);
  97. }
  98. void CHyperlinkStatic::CreateFont()
  99. {
  100. CFont* pFontParent = GetParent()->GetFont();
  101. if ( pFontParent ) {
  102. LOGFONT lf;
  103. pFontParent->GetObject(sizeof(lf), &lf);
  104. lf.lfUnderline = TRUE;
  105. _fontCaption.CreateFontIndirect(&lf);
  106. _bCreateFont = true;
  107. }
  108. }
  109. void CHyperlinkStatic::GetCaptionSize()
  110. {
  111. if (( _bGetCaptionSize == false ) && ( _bCreateFont )) {
  112. CClientDC dc(this);
  113. CFont *pOldFont = dc.SelectObject(&_fontCaption);
  114. _sizeCaption = dc.GetTextExtent(_strCaption);
  115. dc.SelectObject(pOldFont);
  116. _bGetCaptionSize = true;
  117. }
  118. }
  119. bool CHyperlinkStatic::InCaptionRange(CPoint &point)
  120. {
  121. if ( _bGetCaptionSize == false )
  122. return false;
  123. return (( point.x >= 0 )&&( point.x < _sizeCaption.cx ) &&
  124. ( point.y >= 0 )&&( point.y < _sizeCaption.cy ));
  125. }