HyperLink.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:8k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: HyperLink.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. 从 CStatic 继承而来的超级链接类,将静态文本框
  7. 以超级链接形式显示。
  8. ---------------------------------------------------
  9. 工程: Xfilter 个人防火墙
  10. 作者: 朱雁辉,朱雁冰
  11. 创建日期: 2001/08/06
  12. 网址: http://www.xfilt.com
  13. 电子邮件: xstudio@xfilt.com
  14. 版权所有 (c) 2001-2002 X 工作室
  15. 警告:
  16. ---------------------------------------------------
  17. 本电脑程序受著作权法的保护。未经授权,不能使用
  18. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  19. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  20. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  21. 凡通过合法途径购买本软件源代码的用户被默认授权
  22. 可以在自己的程序中使用本软件的部分代码,但作者不对
  23. 代码产生的任何后果负责。
  24. 使用了本软件代码的程序只能以可执行文件形式发布,
  25. 未经特别许可,不能将含有本软件源代码的源程序以任何
  26. 形式发布。
  27. ---------------------------------------------------
  28. */
  29. //=============================================================================================
  30. #include "stdafx.h"
  31. #include "HyperLink.h"
  32. #include <AFXPRIV.H>
  33. #include "..guires.h"
  34. #ifdef _DEBUG
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39. #define TOOLTIP_ID 1
  40. LPSTR XW2T(LPWSTR lp)
  41. {
  42. USES_CONVERSION;
  43. return W2A(lp);
  44. }
  45. CHyperLink::CHyperLink()
  46. {
  47.     m_hLinkCursor = NULL;                
  48.     m_crLinkColour      = RGB(  0,  0, 238);  
  49.     m_crVisitedColour = RGB( 85,  26, 139);  
  50.     m_crHoverColour = ::GetSysColor(COLOR_HIGHLIGHT);
  51.     m_bOverControl      = FALSE;                
  52.     m_bVisited          = FALSE;                
  53.     m_bUnderline        = TRUE;                
  54.     m_bAdjustToFit      = TRUE;                
  55.     m_strURL.Empty();
  56. }
  57. CHyperLink::~CHyperLink()
  58. {
  59.     m_Font.DeleteObject();
  60. }
  61. BEGIN_MESSAGE_MAP(CHyperLink, CStatic)
  62.     //{{AFX_MSG_MAP(CHyperLink)
  63.     ON_CONTROL_REFLECT(STN_CLICKED, OnClicked)
  64.     ON_WM_CTLCOLOR_REFLECT()
  65.     ON_WM_SETCURSOR()
  66.     ON_WM_MOUSEMOVE()
  67.     //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. BOOL CHyperLink::PreTranslateMessage(MSG* pMsg) 
  70. {
  71.     m_ToolTip.RelayEvent(pMsg);
  72.     return CStatic::PreTranslateMessage(pMsg);
  73. }
  74. void CHyperLink::OnClicked()
  75. {
  76.     int result = (int)GotoURL(m_strURL, SW_SHOW);
  77.     m_bVisited = (result > HINSTANCE_ERROR);
  78.     if (!m_bVisited) 
  79. AfxMessageBox(GUI_MESSAGE_HYPER_LINK_ERROR, MB_ICONEXCLAMATION | MB_OK);
  80.     else 
  81.         SetVisited();                       
  82. }
  83. HBRUSH CHyperLink::CtlColor(CDC* pDC, UINT nCtlColor) 
  84. {
  85.     ASSERT(nCtlColor == CTLCOLOR_STATIC);
  86.     if (m_bOverControl)
  87.         pDC->SetTextColor(m_crHoverColour);
  88.     else if (m_bVisited)
  89.         pDC->SetTextColor(m_crVisitedColour);
  90.     else
  91.         pDC->SetTextColor(m_crLinkColour);
  92.     pDC->SetBkMode(TRANSPARENT);
  93.     return (HBRUSH)GetStockObject(NULL_BRUSH);
  94. }
  95. void CHyperLink::OnMouseMove(UINT nFlags, CPoint point) 
  96. {
  97.     CStatic::OnMouseMove(nFlags, point);
  98.     if (m_bOverControl)        
  99.     {
  100.         CRect rect;
  101.         GetClientRect(rect);
  102.         if (!rect.PtInRect(point))
  103.         {
  104.             m_bOverControl = FALSE;
  105.             ReleaseCapture();
  106.             RedrawWindow();
  107.             return;
  108.         }
  109.     }
  110.     else                      
  111.     {
  112.         m_bOverControl = TRUE;
  113.         RedrawWindow();
  114.         SetCapture();
  115.     }
  116. }
  117. BOOL CHyperLink::OnSetCursor(CWnd*, UINT, UINT) 
  118. {
  119.     if (m_hLinkCursor)
  120.     {
  121.         ::SetCursor(m_hLinkCursor);
  122.         return TRUE;
  123.     }
  124.     return FALSE;
  125. }
  126. void CHyperLink::PreSubclassWindow() 
  127. {
  128.     DWORD dwStyle = GetStyle();
  129.     ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
  130.     
  131.     if (m_strURL.IsEmpty())
  132.         GetWindowText(m_strURL);
  133.     CString strWndText;
  134.     GetWindowText(strWndText);
  135.     if (strWndText.IsEmpty()) {
  136.         ASSERT(!m_strURL.IsEmpty());    
  137.         SetWindowText(m_strURL);
  138.     }
  139.     LOGFONT lf;
  140.     GetFont()->GetLogFont(&lf);
  141.     lf.lfUnderline = m_bUnderline;
  142.     m_Font.CreateFontIndirect(&lf);
  143.     SetFont(&m_Font);
  144.     PositionWindow();        
  145.     SetDefaultCursor();     
  146.     CRect rect; 
  147.     GetClientRect(rect);
  148.     m_ToolTip.Create(this);
  149.     m_ToolTip.AddTool(this, m_strURL, rect, TOOLTIP_ID);
  150.     CStatic::PreSubclassWindow();
  151. }
  152. void CHyperLink::SetURL(CString strURL)
  153. {
  154.     m_strURL = strURL;
  155.     if (::IsWindow(GetSafeHwnd())) {
  156.         PositionWindow();
  157.         m_ToolTip.UpdateTipText(strURL, this, TOOLTIP_ID);
  158.     }
  159. }
  160. void CHyperLink::SetVisited(BOOL bVisited) 
  161.     m_bVisited = bVisited; 
  162.     if (::IsWindow(GetSafeHwnd()))
  163.         Invalidate(); 
  164. }
  165. void CHyperLink::PositionWindow()
  166. {
  167.     if (!::IsWindow(GetSafeHwnd()) || !m_bAdjustToFit) 
  168.         return;
  169.     CRect rect;
  170.     GetWindowRect(rect);
  171.     CWnd* pParent = GetParent();
  172.     if (pParent)
  173.         pParent->ScreenToClient(rect);
  174.     CString strWndText;
  175.     GetWindowText(strWndText);
  176.     CDC* pDC = GetDC();
  177.     CFont* pOldFont = pDC->SelectObject(&m_Font);
  178.     CSize Extent = pDC->GetTextExtent(strWndText);
  179.     pDC->SelectObject(pOldFont);
  180.     ReleaseDC(pDC);
  181.     DWORD dwStyle = GetStyle();
  182.     if (dwStyle & SS_CENTERIMAGE)
  183.         rect.DeflateRect(0, (rect.Height() - Extent.cy)/2);
  184.     else
  185.         rect.bottom = rect.top + Extent.cy;
  186.     if (dwStyle & SS_CENTER)  
  187.         rect.DeflateRect((rect.Width() - Extent.cx)/2, 0);
  188.     else if (dwStyle & SS_RIGHT) 
  189.         rect.left  = rect.right - Extent.cx;
  190.     else  
  191.         rect.right = rect.left + Extent.cx;
  192.     SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
  193. }
  194. void CHyperLink::SetDefaultCursor()
  195. {
  196.     if (m_hLinkCursor == NULL)                
  197.     {
  198.         CString strWndDir;
  199.         GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
  200.         strWndDir.ReleaseBuffer();
  201.         strWndDir += _T("\winhlp32.exe");
  202.         HMODULE hModule = LoadLibrary(strWndDir);
  203.         if (hModule) {
  204.             HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
  205.             if (hHandCursor)
  206.                 m_hLinkCursor = CopyCursor(hHandCursor);
  207.         }
  208.         FreeLibrary(hModule);
  209.     }
  210. }
  211. LONG CHyperLink::GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
  212. {
  213.     HKEY hkey;
  214.     LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
  215.     if (retval == ERROR_SUCCESS) {
  216.         long datasize = MAX_PATH;
  217.         TCHAR data[MAX_PATH];
  218.         RegQueryValue(hkey, NULL, data, &datasize);
  219.         lstrcpy(retdata,data);
  220.         RegCloseKey(hkey);
  221.     }
  222.     return retval;
  223. }
  224. HINSTANCE CHyperLink::GotoURL(LPCTSTR url, int showcmd)
  225. {
  226.     TCHAR key[MAX_PATH + MAX_PATH];
  227.     HINSTANCE result = ShellExecute(NULL
  228. , (url[_tcslen(url) -1] == '/') ? _T("explore") : _T("open")
  229. , url, NULL,NULL, showcmd);
  230.     if ((UINT)result <= HINSTANCE_ERROR) {
  231.         if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
  232.             lstrcat(key, _T("\shell\open\command"));
  233.             if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
  234.                 TCHAR *pos;
  235.                 pos = _tcsstr(key, _T(""%1""));
  236.                 if (pos == NULL) {                    
  237.                     pos = _tcsstr(key, _T("%1"));     
  238.                     if (pos == NULL)                 
  239.                         pos = key+lstrlen(key)-1;
  240.                     else
  241.                         *pos = '';                  
  242.                 }
  243.                 else
  244.                     *pos = '';                      
  245.                 lstrcat(pos, _T(" "));
  246.                 lstrcat(pos, url);
  247.                 result = (HINSTANCE) WinExec(key, showcmd);
  248.             }
  249.         }
  250.     }
  251.     return result;
  252. }