QQ登录

只需一步,快速开始

上位机MFC实现带链接效果的文本

[ 复制链接 ]
实现效果:

当前实例通过对CStatic类的扩展,实现文本框带链接,可以设置背景文本颜色等属性。这些属性是通过下面代码实现
        COLORREF bk = RGB(192, 192 ,192);
    COLORREF tx = RGB(  0,  96, 142);   
    m_Static.bkColor( bk );
    m_Static.textColor( tx );
    m_Static.doCustomCursor();// Show a custom cursor  
    m_Static.onClickDoShellCommand("www.gkbc8.com");

效果如下图:

上位机MFC实现带链接效果的文本

上位机MFC实现带链接效果的文本


实现过程
1.新建一对话框工程,添加静态文本控制,如上图,将例程根目录三文件STATICEX.CPP,STATICEX.H,LOGFONT.H复制使用,
或复制帖子尾部的代码,再导入文件到工程。

2.准备好后,可以发再自己工程多出几个集成类,如CStaticEx。
然后是这个类的使用,在主对话框中包含类头文件,添加其实例
#include "StaticEx.h"
CStaticEx        m_Static;
最后是添加实例的初始化代码
        COLORREF bk = RGB(192, 192 ,192);
    COLORREF tx = RGB(  0,  96, 142);   
    m_Static.bkColor( bk );
    m_Static.textColor( tx );
    m_Static.doCustomCursor();// Show a custom cursor  
    m_Static.onClickDoShellCommand("www.gkbc8.com");// Have the ctrl respond to button clicks

这样就可以编译了,编译时提示缺少一个鼠标图像资源IDC_CURSOR_HAND,可以自己添加,或复制使用。

例程中还设置了对话框背景与静态文本控件背景保持一致
主要是准备了一画刷CBrush m_bkBrush;m_bkBrush.CreateSolidBrush(bk);    来填充对话框背景
HBRUSH CCTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

        if(nCtlColor==CTLCOLOR_DLG)
                return   m_bkBrush;  

       
        return hbr;
}

下面是文件源代码,可以复制使用或直接下载例程:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CTest.rar 
文件大小:39.11 KB  售价:1金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  1. // Description:
  2. //
  3. //  Extended CStatic class. Allows easy customization of the following:
  4. //
  5. //      1. COLORREF CStaticEx::bkColor( COLORREF crColor )
  6. //         - Sets back ground color of the control
  7. //
  8. //      2. COLORREF CStaticEx::textColor( COLORREF crColor )
  9. //         - Sets text or foreground color of the control
  10. //
  11. //      3. COLORREF bkColor() const
  12. //         - Returns back ground color of control
  13. //
  14. //      4. COLORREF textColor() const
  15. //         - Returns text (or foreground) color of control
  16. //
  17. //      5. void onClickDoShellCommand( const CString& linkName )
  18. //
  19. //         (Note: the idea for this part of the control
  20. //                came fom Paul DiLascia in the December issue
  21. //                of MSJ )
  22. //
  23. //         - Use control as a link to open a link (this may
  24. //           be an exe if you like...
  25. //
  26. //         COLORREF setLinkColorVisited( COLORREF crColor )
  27. //         - Sets the visit color, returns previous setting
  28. //
  29. //         COLORREF setLinkColorUnvisited( COLORREF crColor )
  30. //         - Sets the unvisited color, returns previous setting
  31. //
  32. //
  33. //
  34. #if !defined(AFX_STATICEX_H__CC617FC0_4FE2_11D1_9E2E_40E806C10000__INCLUDED_)
  35. #define AFX_STATICEX_H__CC617FC0_4FE2_11D1_9E2E_40E806C10000__INCLUDED_

  36. #if _MSC_VER >= 1000
  37. #pragma once
  38. #endif // _MSC_VER >= 1000

  39. typedef void (*CWND_INIT_FUNCTION)();

  40. /////////////////////////////////////////////////////////////////////////////
  41. // CStaticEx window

  42. class CStaticEx : public CStatic
  43. {
  44. // Construction
  45. public:
  46.         CStaticEx();

  47. // Copy Semantics

  48.    // Block copy construction...
  49.    //
  50.    // No m_hWnd defined for object.
  51.    //
  52. private:
  53.    CStaticEx( const CStaticEx& );

  54. public:
  55.    // Allow basics to be copied...
  56.    CStaticEx& operator = ( const CStaticEx& );

  57. public:
  58.     DECLARE_DYNCREATE( CStaticEx )

  59. // Attributes

  60.     // Turn off and on showing off the default cursor
  61.     //
  62.     void doCustomCursor( bool custom = true )
  63.     {  
  64.         m_doCustomCursor = custom;
  65.     }

  66.     // Font control
  67.     //
  68.     void setFont( const LOGFONT* lpLogFont );

  69.     void setFont( LONG fontHeight      = -8,
  70.                   LONG fontWeight      = FW_NORMAL,
  71.                   UCHAR pitchAndFamily = DEFAULT_PITCH | FF_DONTCARE,
  72.                   LPCSTR faceName      = _T("MS Sans Serif" ) );
  73.    
  74.     void onClickDoShellCommand( const CString& linkAddress = "mailto:bberry@javanet.com" );

  75.     // This method will send a windows message if onClickSendMessage() has
  76.     // defined a message to send
  77.     //
  78.     void onClickShowModalDialog( CDialog* dlg = 0 )
  79.     {   m_dialog = dlg;
  80.     }

  81.     // On a windows click event show this window object
  82.     //
  83.     void onClickShowWindow( CWnd* cwnd = 0 )
  84.     {   
  85.         ASSERT( cwnd && ::IsWindow(cwnd->m_hWnd) );
  86.         m_showThisCwnd = cwnd;
  87.     }

  88.     // Send a windows message when a OnClick event occurs
  89.     //
  90.     void onClickSendMessage( CWnd* cwnd = 0, UINT wm_message = 0, WPARAM flags = 0 )
  91.     {
  92.         ASSERT( cwnd&& ::IsWindow(cwnd->m_hWnd) );
  93.         m_sendMsgToThisCwnd = cwnd;
  94.         m_msg_flags  = flags;
  95.         m_wm_message = wm_message;
  96.     }

  97.     // Turn click events on or off
  98.     //
  99.     void doOnClickEvents( bool doEvents = true )
  100.     {
  101.         DWORD dwStyle = GetStyle();

  102.         if ( doEvents )
  103.         {
  104.              if ( !(dwStyle & SS_NOTIFY) )
  105.                   ::SetWindowLong( m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY );
  106.         }
  107.         else
  108.         {
  109.              if ( (dwStyle & SS_NOTIFY) ) {
  110.                   dwStyle ^= SS_NOTIFY;
  111.                   ::SetWindowLong( m_hWnd, GWL_STYLE, dwStyle );
  112.              }
  113.         }
  114.     }


  115.     // Control coloring of the static object
  116.     //
  117.     COLORREF bkColor  ( COLORREF );   
  118.     COLORREF bkColor()   const { return m_crBkColor;   }   
  119.    
  120.     COLORREF textColor( COLORREF );
  121.     COLORREF textColor() const { return m_crTextColor; }

  122.     // Set up shell link colors
  123.     //
  124.     COLORREF setLinkColorVisited( COLORREF );
  125.     COLORREF setLinkColorUnvisited( COLORREF );

  126. // Overrides
  127.         // ClassWizard generated virtual function overrides
  128.         //{{AFX_VIRTUAL(CStaticEx)
  129.         //}}AFX_VIRTUAL

  130. // Implementation
  131.         virtual ~CStaticEx();

  132.         // Generated message map functions
  133. protected:
  134.         //{{AFX_MSG(CStaticEx)
  135.         //}}AFX_MSG

  136.     afx_msg void OnClicked();
  137.         afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
  138.     afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );
  139.    
  140.         DECLARE_MESSAGE_MAP()

  141.     // Customize your brush
  142.     //
  143.     virtual BOOL CreateBrushType();

  144. private:
  145.     CWnd*    m_showThisCwnd;        // a window to show when a click event
  146.                                     // occurs

  147.     CWnd*    m_sendMsgToThisCwnd;   // the window to send messages to when
  148.                                     // a click event occurs

  149.     UINT     m_wm_message;          // the windows message event
  150.                                     // initialize the m_showThisCwnd object

  151.     WPARAM   m_msg_flags;           // data to send on click events

  152.     CDialog* m_dialog;              // a dialog to show on show on a click event

  153.     bool m_doCustomCursor;          // don't show the hand cursor

  154.     CBrush   m_brBkGround;          // the back ground brush

  155.     BOOL     m_didClickEvent;       // use to flag if a click event ever happened
  156.     CString  m_shellCommandArg;     // The actual link

  157.     COLORREF m_crBkColor;
  158.     COLORREF m_crTextColor;
  159.     COLORREF m_crOnClickColor;
  160.     //
  161.     // COLORREF m_crUnvisited = m_crTextColor;
  162.     //
  163.     CFont*   m_pCFont;
  164. };

  165. /////////////////////////////////////////////////////////////////////////////

  166. //{{AFX_INSERT_LOCATION}}
  167. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  168. #endif // !defined(AFX_STATICEX_H__CC617FC0_4FE2_11D1_9E2E_40E806C10000__INCLUDED_)
复制代码
  1. // Description:
  2. //
  3. //  Extended CStatic class. Allows easy customization of the following:
  4. //
  5. //      1. COLORREF bkColor( COLORREF crColor )
  6. //         - Sets back ground color of the control
  7. //
  8. //      2. COLORREF textColor( COLORREF crColor )
  9. //         - Sets text or foreground color of the control
  10. //
  11. //      3. COLORREF bkColor() const
  12. //         - Returns back ground color of control
  13. //
  14. //      4. COLORREF textColor() const
  15. //         - Returns text (or foreground) color of control
  16. //
  17. //      5. void setFont( const LOGFONT* lpLogFont )
  18. //         - Sets the font of the static control.
  19. //
  20. //      6. void onClickDoShellCommand( const CString& linkName )
  21. //
  22. //         (Note: the idea for this part of the control
  23. //                came fom Paul DiLascia in the December issue
  24. //                of MSJ )
  25. //
  26. //         - Use control as a link to open a link (this may
  27. //           be an exe if you like...
  28. //
  29. //      7. COLORREF setLinkColorVisited( COLORREF crColor )
  30. //         - Sets the visit color, returns previous setting
  31. //
  32. //      8. COLORREF setLinkColorUnvisited( COLORREF crColor )
  33. //         - Sets the unvisited color, returns previous setting
  34. //
  35. //      *** Set new font for this control ***
  36. //
  37. //      9. void setFont( const LOGFONT* lpLogFont );
  38. //  
  39. //     10. void setFont( LONG fontHeight      = -8,
  40. //                       LONG fontWeight      = FW_NORMAL,
  41. //                       UCHAR pitchAndFamily = DEFAULT_PITCH | FF_DONTCARE,
  42. //                       LPCSTR faceName      = _T("MS Sans Serif"         
  43. //                     );
  44. //
  45. #include "stdafx.h"
  46. #include "resource.h"
  47. #include "LogFont.h"
  48. #include "StaticEx.h"

  49. #ifdef _DEBUG
  50. #define new DEBUG_NEW
  51. #undef THIS_FILE
  52. static char THIS_FILE[] = __FILE__;
  53. #endif

  54. /////////////////////////////////////////////////////////////////////////////
  55. // CStaticEx

  56. IMPLEMENT_DYNCREATE( CStaticEx, CStatic )

  57. BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
  58.         //{{AFX_MSG_MAP(CStaticEx)
  59.         //}}AFX_MSG_MAP
  60.     ON_WM_SETCURSOR()
  61.     ON_WM_CTLCOLOR_REFLECT()
  62.     ON_CONTROL_REFLECT( STN_CLICKED, OnClicked )
  63. END_MESSAGE_MAP()

  64. CStaticEx::CStaticEx()
  65. {
  66.     // Use system colors for defaults
  67.     //
  68.     m_crTextColor = ::GetSysColor( COLOR_WINDOWTEXT );
  69.     m_crBkColor   = ::GetSysColor( COLOR_3DFACE     );

  70.     m_crOnClickColor   = RGB( 0,  128, 192 );

  71.     // The default brush type; SOLID
  72.     //
  73.     CreateBrushType();

  74.     // Uses default font
  75.     //
  76.     m_pCFont = 0;

  77.     // Link was not visited
  78.     //
  79.     m_didClickEvent = FALSE;

  80.     // Set to popup a dialog when this control is clicked
  81.     //
  82.     m_dialog = 0;

  83.     // Show a new window when this control is clicked
  84.     //
  85.     m_showThisCwnd = 0;
  86.     m_sendMsgToThisCwnd = 0;

  87.     // defines a message that may be sent to m_showThisCwnd
  88.     //
  89.     m_msg_flags  = 0;
  90.     m_wm_message = 0;

  91.     // Do use the hand cursor
  92.     //
  93.     m_doCustomCursor = false;
  94. }

  95. CStaticEx::~CStaticEx()
  96. {
  97.     if ( m_pCFont ) delete m_pCFont;
  98. }


  99. // Note: Copy construction is blocked for this class.
  100. //       This is because there would be no defined
  101. //       m_hWnd during the construction of the object.
  102. //
  103. // CStaticEx::CStaticEx( const CStaticEx& o )
  104. //

  105. // Allow = operator to be used for copying basics.
  106. //
  107. CStaticEx& CStaticEx::operator = ( const CStaticEx& o )
  108. {

  109.     _ASSERT( o != *this ); // You probably did not mean to do this...

  110.     if ( o == *this ) return *this; // copying self...
  111.    
  112.     m_shellCommandArg  = o.m_shellCommandArg;
  113.     m_crOnClickColor   = o.m_crOnClickColor;

  114.     bkColor( o.m_crBkColor );
  115.     textColor( o.m_crTextColor );

  116.     if ( o.m_pCFont ) {
  117.          CLogFont pLogFont;
  118.          o.m_pCFont->GetLogFont( &pLogFont );
  119.          setFont( &pLogFont );
  120.     }

  121.     m_dialog            = o.m_dialog;
  122.     m_showThisCwnd      = o.m_showThisCwnd;
  123.     m_didClickEvent     = o.m_didClickEvent;
  124.     m_sendMsgToThisCwnd = o.m_sendMsgToThisCwnd;
  125.     m_msg_flags         = o.m_msg_flags;
  126.     m_wm_message        = o.m_wm_message;
  127.     m_doCustomCursor    = o.m_doCustomCursor;

  128.     return *this;
  129. }

  130. /////////////////////////////////////////////////////////////////////////////
  131. // CStaticEx message handlers

  132. void CStaticEx::setFont( const LOGFONT* lpLogFont )
  133. {
  134.     _ASSERT( lpLogFont ); // logfont is not defined!!!

  135.     if ( !lpLogFont ) return;

  136.     if ( m_pCFont ) delete m_pCFont;
  137.    
  138.     m_pCFont = new CFont;
  139.     m_pCFont->CreateFontIndirect( lpLogFont );

  140.     SetFont( m_pCFont );
  141. }

  142. void CStaticEx::setFont( LONG fontHeight      /* = -8                         */,
  143.                          LONG fontWeight      /* = FW_NORMAL                  */,
  144.                          UCHAR pitchAndFamily /* = DEFAULT_PITCH | FF_DONTCARE*/,
  145.                          LPCSTR faceName      /* = _T("MS Sans Serif")        */ )
  146. {
  147.     if ( m_pCFont )
  148.     {
  149.         delete m_pCFont;
  150.     }
  151.     m_pCFont = new CFont;

  152.     const CLogFont lf( fontHeight,
  153.                        FW_NORMAL,
  154.                        pitchAndFamily,
  155.                        faceName
  156.                      );

  157.     m_pCFont->CreateFontIndirect( &lf );

  158.     SetFont( m_pCFont );
  159. }

  160. COLORREF CStaticEx::bkColor( COLORREF crColor )
  161. {
  162.     _ASSERT(::IsWindow(m_hWnd));

  163.     COLORREF cr = m_crBkColor;
  164.    
  165.     m_crBkColor = crColor;
  166.    
  167.     m_brBkGround.DeleteObject();
  168.    
  169.     CreateBrushType();
  170.    
  171.     Invalidate();

  172.     return cr;
  173. }

  174. COLORREF CStaticEx::textColor( COLORREF crColor )
  175. {
  176.     _ASSERT(::IsWindow(m_hWnd));
  177.    
  178.     COLORREF cr = m_crTextColor;
  179.    
  180.     m_crTextColor = crColor;
  181.    
  182.     Invalidate();
  183.    
  184.     return cr;
  185. }

  186. COLORREF CStaticEx::setLinkColorVisited( COLORREF crColor )
  187. {
  188.     COLORREF c  = m_crOnClickColor;
  189.     m_crOnClickColor = crColor;
  190.     return c;
  191. }
  192. COLORREF CStaticEx::setLinkColorUnvisited( COLORREF crColor )
  193. {
  194.     m_crTextColor = crColor;
  195.     return textColor( crColor );
  196. }


  197. BOOL CStaticEx::CreateBrushType()
  198. {
  199.     return m_brBkGround.CreateSolidBrush( m_crBkColor );
  200. }

  201. void CStaticEx::onClickDoShellCommand( const CString& linkAddress /* = "bberry@javanet.com" */ )
  202. {
  203.     m_shellCommandArg  = linkAddress;
  204. }



  205. HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor)
  206. {
  207.     // Setup for receiving mouse input; we only turn it
  208.     // on if it is needed...
  209.     //
  210.     if ( !m_shellCommandArg.IsEmpty() )
  211.     {
  212.          doOnClickEvents();
  213.          pDC->SetTextColor( m_didClickEvent ? m_crOnClickColor : m_crTextColor );
  214.     }
  215.     else
  216.          pDC->SetTextColor( m_crTextColor );
  217.   
  218.     pDC->SetBkColor  ( m_crBkColor );

  219.     return (HBRUSH)m_brBkGround;
  220. }

  221. void CStaticEx::OnClicked()
  222. {
  223.     if ( m_showThisCwnd )
  224.     {
  225.         if ( m_showThisCwnd->IsWindowVisible() )
  226.              m_showThisCwnd->ShowWindow( SW_HIDE );
  227.         else
  228.              m_showThisCwnd->ShowWindow( SW_SHOW );
  229.     }

  230.     if ( m_dialog )
  231.     {
  232.          m_dialog->DoModal();         
  233.     }

  234.     if ( !m_shellCommandArg.IsEmpty() )
  235.     {
  236.          // Call ShellExecute to run the link...
  237.          //
  238.          HINSTANCE h = ShellExecute( 0, "open", m_shellCommandArg, 0, 0, SW_SHOWNORMAL );

  239.          if ( (UINT)h > 32 ) {
  240.               m_didClickEvent = TRUE;
  241.               Invalidate();
  242.          }
  243.          else {
  244.              MessageBeep(0);
  245.              AfxMessageBox( "Unable to open " + m_shellCommandArg + '.', MB_OK | MB_ICONINFORMATION );
  246.          }
  247.     }

  248.     if ( m_wm_message )
  249.     {
  250.         ::SendMessage( m_sendMsgToThisCwnd->m_hWnd, m_wm_message, m_msg_flags, 0 );
  251.     }
  252. }

  253. BOOL CStaticEx::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message )
  254. {
  255.     HCURSOR hCursor;

  256.     if ( m_doCustomCursor )
  257.     {
  258.         hCursor = AfxGetApp()->LoadCursor( IDC_CURSOR_HAND );
  259.     }
  260.     else
  261.     {
  262.         hCursor = AfxGetApp()->LoadStandardCursor( IDC_ARROW );
  263.     }

  264.     _ASSERT( hCursor );

  265.     ::SetCursor( hCursor );

  266.     return TRUE;
  267. }
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索