与网页链接相似的CLinkStatic类

与网页链接相似的CLinkStatic类

先创建一个类,见到Static可能会想继承自CStatic吧,其实我觉得继承自CWnd会更好,由于绘制等的都是自己写的,CStatic提供的东西没有用到.
添加以下两个成员变量

CString m_csTitle;   // 显示的标题
CString m_csUrl;   // 点击后跳到的URL

可以添加SetTitle和SetUrl两个函数给外部使用.

添加OnPain,OnMouseMove和OnLButtonDown几个函数,
OnPaint:把要显示的TITLE画出来,最好选个好看的字体,默认的字体好难看
OnMouseMove:鼠标在链接上移动时用SetCursor改变鼠标的图标,
OnLButtonDown:鼠标点击,随便调用ShellExecut用m_csUrl就可以了

如果想效果好一点,例如鼠标在链接上移动时改变链接的颜色或将文字变成有下划线(underline),可以在OnMouseMove中使用SetCapture捕捉鼠标,然后在程序里判断鼠标的移进移出,或者用TrackMouseEvent后就可以接受OnMouseEnter和OnMouseLeave了.

为了在使用时容易用,最好自己写一个Create,对了,如果继承自CStatic,创建时要加一个SS_NOTIFY的样式才可以接收那些OnLButtonDown的函数.

部分代码贴出来

/**/ /////////////////////////////////////////////////////////////////////////////
//  CLinkStatic

CLinkStatic::CLinkStatic()
{
    m_ftDef.CreatePointFont(
90,"宋体");

    m_clrDef
=RGB(0,0,0xff);
    m_clrHover
=RGB(0xff,0,0);

    m_bHover
=FALSE;
}


BEGIN_MESSAGE_MAP(CLinkStatic, CWnd)
    
// {{AFX_MSG_MAP(CLinkStatic)
    ON_WM_MOUSEMOVE()
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    
// }}AFX_MSG_MAP
END_MESSAGE_MAP()

/**/ /////////////////////////////////////////////////////////////////////////////
//  CLinkStatic message handlers

void  CLinkStatic::OnMouseMove(UINT nFlags, CPoint point) 
{
    CWnd::OnMouseMove(nFlags, point);

    CRect rt;
    GetClientRect(
&rt);
    
    
if(!rt.PtInRect(point))
    
{
        ReleaseCapture();
        m_bHover
=FALSE;
    }

    
else
    
{
        SetCapture();
        m_bHover
=TRUE;
        ::SetCursor(LoadCursor(NULL,IDC_HAND));
    }


    Invalidate();
}


void  CLinkStatic::OnPaint()
{
    CPaintDC dc(
this); // device context for painting
    CFont *pOldFont=dc.SelectObject(&m_ftDef);
    
    CRect rt;
    GetClientRect(
&rt);
    
    dc.SetTextColor(m_bHover
?m_clrHover:m_clrDef);
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText(m_csTitle,
&rt,DT_SINGLELINE|DT_VCENTER);

    dc.SelectObject(pOldFont);
}


void  CLinkStatic::SetUrl(CString csUrl)
{
    m_csUrl
=csUrl;
}


void  CLinkStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CWnd::OnLButtonDown(nFlags, point);

    
if(m_csUrl.IsEmpty())return;

    ShellExecute(NULL,
"open",m_csUrl,NULL,NULL,SW_SHOW);

    ReleaseCapture();
    m_bHover
=FALSE;
    Invalidate();
}


BOOL CLinkStatic::Create(CString csTitle, CWnd 
* pParant, CRect rt /**/ /*=CRect(0,0,0,0)*/ )
{
    
if(CWnd::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rt,pParant,0xffff)==FALSE)
        
return FALSE;
    m_csTitle
=csTitle;
    
return TRUE;
}

你可能感兴趣的:(与网页链接相似的CLinkStatic类)