类似于网页上面的“链接”,一行文字,当鼠标移动过去的时候,有下划线,点击的时候自动打开一个IE窗口……谢谢:)

解决方案 »

  1.   

    //超连接类的使用
    //以下为  HyperLink.h     StaticLink.h     StaticLink.cpp  三个文件,剪切后分别保存//HyperLink.h
    #ifndef _HYPRILNK_H
    #define _HYPRILNK_H//////////////////
    // Simple text hyperlink derived from CString
    //
    class CHyperlink : public CString {
    public:
        CHyperlink(LPCTSTR lpLink = NULL) : CString(lpLink) { }
        ~CHyperlink() { }
        const CHyperlink& operator=(LPCTSTR lpsz) {
            CString::operator=(lpsz);
            return *this;
        }
        operator LPCTSTR() {
            return CString::operator LPCTSTR(); 
        }
        virtual HINSTANCE Navigate() {
            return IsEmpty() ? NULL :
                ShellExecute(0, _T("open"), *this, 0, 0, SW_SHOWNORMAL);
        }
    };#endif////////////////////////////////////////////////////////////////////////////////////StaticLink.h#ifndef _STATLINK_H
    #define _STATLINK_H#include "HyprLink.h"//////////////////
    // CStaticLink implements a static control that's a hyperlink
    // to any file on your desktop or web. You can use it in dialog boxes
    // to create hyperlinks to web sites. When clicked, opens the file/URL
    //
    class CStaticLink : public CStatic {
    public:
        DECLARE_DYNAMIC(CStaticLink)
        CStaticLink(LPCTSTR lpText = NULL, BOOL bDeleteOnDestroy=FALSE);
        ~CStaticLink() { }    // Hyperlink contains URL/filename. If NULL, I will use the window text.
        // (GetWindowText) to get the target.
        CHyperlink    m_link;
        COLORREF        m_color;    // Default colors you can change
        // These are global, so they're the same for all links.
        static COLORREF g_colorUnvisited;
        static COLORREF g_colorVisited;    // Cursor used when mouse is on a link--you can set, or
        // it will default to the standard hand with pointing finger.
        // This is global, so it's the same for all links.
        static HCURSOR     g_hCursorLink;protected:
        CFont            m_font;                    // underline font for text control
        BOOL            m_bDeleteOnDestroy;    // delete object when window destroyed?    virtual void PostNcDestroy();    // message handlers
        DECLARE_MESSAGE_MAP()
        afx_msg UINT    OnNcHitTest(CPoint point);
        afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
        afx_msg void    OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg BOOL    OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    };#endif _STATLINK_H//////////////////////////////////////////////////////////////////////////////////////
      

  2.   

    //StaticLink.cpp
    #include "StdAfx.h"
    #include "StatLink.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifCOLORREF CStaticLink::g_colorUnvisited = RGB(0,0,255);         // blue
    COLORREF CStaticLink::g_colorVisited   = RGB(128,0,128);         // purpleHCURSOR    CStaticLink::g_hCursorLink = NULL;IMPLEMENT_DYNAMIC(CStaticLink, CStatic)BEGIN_MESSAGE_MAP(CStaticLink, CStatic)
        ON_WM_NCHITTEST()
        ON_WM_CTLCOLOR_REFLECT()
        ON_WM_LBUTTONDOWN()
        ON_WM_SETCURSOR()
    END_MESSAGE_MAP()///////////////////
    // Constructor sets default colors = blue/purple.
    // bDeleteOnDestroy is used internally by PixieLib in CPixieDlg.
    //
    CStaticLink::CStaticLink(LPCTSTR lpText, BOOL bDeleteOnDestroy)
    {
        m_link = lpText;                                // link text (NULL ==> window text)
        m_color = g_colorUnvisited;                // not visited yet
        m_bDeleteOnDestroy = bDeleteOnDestroy;    // delete object with window?
    }//////////////////
    // Normally,    a static control does not get mouse events unless it has
    // SS_NOTIFY. This achieves the same effect as SS_NOTIFY, but it's fewer
    // lines of code and more reliable than turning on SS_NOTIFY in OnCtlColor
    // because Windows doesn't send WM_CTLCOLOR to bitmap static controls.
    //
    UINT CStaticLink::OnNcHitTest(CPoint point)
    {
        return HTCLIENT;
    }//////////////////
    // Handle reflected WM_CTLCOLOR to set custom control color.
    // For a text control, use visited/unvisited colors and underline font.
    // For non-text controls, do nothing. Also ensures SS_NOTIFY is on.
    //
    HBRUSH CStaticLink::CtlColor(CDC* pDC, UINT nCtlColor)
    {
        ASSERT(nCtlColor == CTLCOLOR_STATIC);
        DWORD dwStyle = GetStyle();
        
        HBRUSH hbr = NULL;
        if ((dwStyle & 0xFF) <= SS_RIGHT) {        // this is a text control: set up font and colors
            if (!(HFONT)m_font) {
                // first time init: create font
                LOGFONT lf;
                GetFont()->GetObject(sizeof(lf), &lf);
                lf.lfUnderline = TRUE;
                m_font.CreateFontIndirect(&lf);
            }        // use underline font and visited/unvisited colors
            pDC->SelectObject(&m_font);
            pDC->SetTextColor(m_color);
            pDC->SetBkMode(TRANSPARENT);        // return hollow brush to preserve parent background color
            hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
        }
        return hbr;
    }/////////////////
    // Handle mouse click: navigate link
    //
    void CStaticLink::OnLButtonDown(UINT nFlags, CPoint point)
    {
        if (m_link.IsEmpty()) {
            // no link: try to load from resource string or window text 
            m_link.LoadString(GetDlgCtrlID()) || (GetWindowText(m_link),1);
            if (m_link.IsEmpty())
                return;
        }    // Call ShellExecute to run the file.
        // For an URL, this means opening it in the browser.
        //
        HINSTANCE h = m_link.Navigate();
        if ((UINT)h > 32) {                         // success!
            m_color = g_colorVisited;             // change color
            Invalidate();                             // repaint 
        } else {
            MessageBeep(0);        // unable to execute file!
            TRACE(_T("*** WARNING: CStaticLink: unable to navigate link %s\n"),
                (LPCTSTR)m_link);
        }
    }//////////////////
    // Set "hand" cursor to cue user that this is a link. If app has not set
    // g_hCursorLink, then try to get the cursor from winhlp32.exe,
    // resource 106, which is a pointing finger. This is a bit of a kludge,
    // but it works.
    //
    BOOL CStaticLink::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    {
        if (g_hCursorLink == NULL) {
            static bTriedOnce = FALSE;
            if (!bTriedOnce) {
             CString windir;
             GetWindowsDirectory(windir.GetBuffer(MAX_PATH), MAX_PATH);
             windir.ReleaseBuffer();
             windir += _T("\\winhlp32.exe");
             HMODULE hModule = LoadLibrary(windir);
                if (hModule) {
                    g_hCursorLink =
                        CopyCursor(::LoadCursor(hModule, MAKEINTRESOURCE(106)));
                }
                FreeLibrary(hModule);
                bTriedOnce = TRUE;
            }
        }
        if (g_hCursorLink) {
            ::SetCursor(g_hCursorLink);
            return TRUE;
        }
        return FALSE;
    }//////////////////
    // Normally, a control class is not destoyed when the window is;
    // however, CPixieDlg creates static controls with "new" instead of
    // as class members, so it's convenient to allow the option of destroying
    // object with window. In applications where you want the object to be
    // destoyed along with the window, you can call constructor with
    // bDeleteOnDestroy=TRUE.
    //
    void CStaticLink::PostNcDestroy()
    {
        if (m_bDeleteOnDestroy)
            delete this;
    }
      

  3.   

    使用方法1.建立工程,将三个文件添加到工程里面2.在对话框中添加3个Static,分别如下:
    ID                Title              
    IDC_PDURL       WWW.ALON21.COM
    IDC_PDURL1      Alon'Web
    IDC_PDURL2      [email protected].在对话框类中添加成员变量:
    public:
            CStaticLink m_wndLink1;
    CStaticLink m_wndLink2;
    CStaticLink m_wndLink3;4.在对话框类的OnInitDialog中添加代码:m_wndLink2.m_link =_T("http://www.Alon21.com");
    m_wndLink3.m_link = _T("mailto:[email protected]");m_wndLink1.SubclassDlgItem(IDC_PDURL,this);
    m_wndLink2.SubclassDlgItem(IDC_PDURL1,this);
    m_wndLink3.SubclassDlgItem(IDC_PDURL2,this);
      

  4.   

    谢谢,这个类很好用。但是我做了一点修改,把void  CStaticLink::OnLButtonDown( ) 改称OnLButtonUp(),觉得这样更合理些。