先创建一个类,见到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;
}