StaticLink.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // StaticLink.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "StaticLink.h"
  26. // CStaticLink
  27. COLORREF CStaticLink::g_colorUnvisited = RGB(0,0,255);         // blue 
  28. COLORREF CStaticLink::g_colorVisited   = RGB(128,0,128);         // purple 
  29. HCURSOR    CStaticLink::g_hCursorLink = NULL; 
  30. IMPLEMENT_DYNAMIC(CStaticLink, CStatic) 
  31. BEGIN_MESSAGE_MAP(CStaticLink, CStatic) 
  32.     //ON_WM_NCHITTEST() 
  33.     ON_WM_CTLCOLOR_REFLECT() 
  34.     ON_WM_LBUTTONDOWN() 
  35.     ON_WM_SETCURSOR() 
  36. END_MESSAGE_MAP() 
  37. /////////////////// 
  38. // Constructor sets default colors = blue/purple. 
  39. // bDeleteOnDestroy is used internally by PixieLib in CPixieDlg. 
  40. // 
  41. CStaticLink::CStaticLink(LPCTSTR lpText, BOOL bDeleteOnDestroy) 
  42.     m_link = lpText;                                // link text (NULL ==> window text) 
  43.     m_color = g_colorUnvisited;                // not visited yet 
  44.     m_bDeleteOnDestroy = bDeleteOnDestroy;    // delete object with window? 
  45. ////////////////// 
  46. // Normally,    a static control does not get mouse events unless it has 
  47. // SS_NOTIFY. This achieves the same effect as SS_NOTIFY, but it's fewer 
  48. // lines of code and more reliable than turning on SS_NOTIFY in OnCtlColor 
  49. // because Windows doesn't send WM_CTLCOLOR to bitmap static controls. 
  50. // 
  51. LRESULT CStaticLink::OnNcHitTest(CPoint point) 
  52.     return HTCLIENT; 
  53. ////////////////// 
  54. // Handle reflected WM_CTLCOLOR to set custom control color. 
  55. // For a text control, use visited/unvisited colors and underline font. 
  56. // For non-text controls, do nothing. Also ensures SS_NOTIFY is on. 
  57. // 
  58. HBRUSH CStaticLink::CtlColor(CDC* pDC, UINT nCtlColor) 
  59.     ASSERT(nCtlColor == CTLCOLOR_STATIC); 
  60.     DWORD dwStyle = GetStyle(); 
  61.      
  62.     HBRUSH hbr = NULL; 
  63.     if ((dwStyle & 0xFF) <= SS_RIGHT) { 
  64.         // this is a text control: set up font and colors 
  65.         if (!(HFONT)m_font) { 
  66.             // first time init: create font 
  67.             LOGFONT lf; 
  68.             GetFont()->GetObject(sizeof(lf), &lf); 
  69.             lf.lfUnderline = TRUE; 
  70.             m_font.CreateFontIndirect(&lf); 
  71.         } 
  72.         // use underline font and visited/unvisited colors 
  73.         pDC->SelectObject(&m_font); 
  74.         pDC->SetTextColor(m_color); 
  75.         pDC->SetBkMode(TRANSPARENT); 
  76.         // return hollow brush to preserve parent background color 
  77.         hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH); 
  78.     } 
  79.     return hbr; 
  80. ///////////////// 
  81. // Handle mouse click: navigate link 
  82. // 
  83. void CStaticLink::OnLButtonDown(UINT nFlags, CPoint point) 
  84.     if (m_link.IsEmpty()) { 
  85.         // no link: try to load from resource string or window text  
  86.         m_link.LoadString(GetDlgCtrlID()) || (GetWindowText(m_link),1); 
  87.         if (m_link.IsEmpty()) 
  88.             return; 
  89.     } 
  90.     // Call ShellExecute to run the file. 
  91.     // For an URL, this means opening it in the browser. 
  92.     // 
  93.     HINSTANCE h = m_link.Navigate(); 
  94.     if ((UINT)h > 32) {                         // success! 
  95.         m_color = g_colorVisited;             // change color 
  96.         Invalidate();                             // repaint  
  97.     } else { 
  98.         MessageBeep(0);        // unable to execute file! 
  99.         TRACE(_T("*** WARNING: CStaticLink: unable to navigate link %sn"), 
  100.             (LPCTSTR)m_link); 
  101.     } 
  102. ////////////////// 
  103. // Set "hand" cursor to cue user that this is a link. If app has not set 
  104. // g_hCursorLink, then try to get the cursor from winhlp32.exe, 
  105. // resource 106, which is a pointing finger. This is a bit of a kludge, 
  106. // but it works. 
  107. // 
  108. BOOL CStaticLink::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  109.     if (g_hCursorLink == NULL) { 
  110.         static BOOL bTriedOnce = FALSE; 
  111.         if (!bTriedOnce) { 
  112.          CString windir; 
  113.          GetWindowsDirectory(windir.GetBuffer(MAX_PATH), MAX_PATH); 
  114.          windir.ReleaseBuffer(); 
  115.          windir += _T("\winhlp32.exe"); 
  116.          HMODULE hModule = LoadLibrary(windir); 
  117.             if (hModule) { 
  118.                 g_hCursorLink = 
  119.                     CopyCursor(::LoadCursor(hModule, MAKEINTRESOURCE(106))); 
  120.             } 
  121.             FreeLibrary(hModule); 
  122.             bTriedOnce = TRUE; 
  123.         } 
  124.     } 
  125.     if (g_hCursorLink) { 
  126.         ::SetCursor(g_hCursorLink); 
  127.         return TRUE; 
  128.     } 
  129.     return FALSE; 
  130. ////////////////// 
  131. // Normally, a control class is not destoyed when the window is; 
  132. // however, CPixieDlg creates static controls with "new" instead of 
  133. // as class members, so it's convenient to allow the option of destroying 
  134. // object with window. In applications where you want the object to be 
  135. // destoyed along with the window, you can call constructor with 
  136. // bDeleteOnDestroy=TRUE. 
  137. // 
  138. void CStaticLink::PostNcDestroy() 
  139.     if (m_bDeleteOnDestroy) 
  140.         delete this;