现在很多IM软件的聊天对话框在接收到网站URL的时候,都能够显示成大家熟悉的蓝色,鼠标移到链接上,还会出现手样的鼠标指针,用户点击后就可以直接打开相应的URL,这对IM软件确实很有用吧,这么方便,实现起来难吗?其实一点也不难,只要设置让你的RICHEDIT支持链接,自动检测URL就行了,再实现一个对连接点击的响应函数就行了。总的来说就几行代码,看看吧。
我用一个对话框工程来说明一下吧。
首先,生成一个对话框工程,在界面上加入一个RichEdit控件,并用向导添加一个代码该控件的控件类成员变量,就叫m_re吧。
现在,该让控件支持超链接和自动检测URL了,在对话框类的OnInitDialog()函数中,我们加入下面的代码就行了:
DWORD Mask = m_re.GetEventMask();
Mask = Mask | ENM_LINK | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS | ENM_KEYEVENTS;
m_re.SetEventMask(Mask);
::SendMessage(m_re.m_hWnd, EM_AUTOURLDETECT, true, 0);
这时候,如果编译运行,你在RICHEDIT中输入如www.163.com的话,它会显示成蓝色,鼠标移到链接上,还会出现手样的鼠标指针,但点击链接的时候它什么也不做,因为我们还没有告诉电脑,我们点击链接后它该帮我们做什么。下面我们就通过一个函数告诉电脑,请帮我打开这个链接。
打开链接。在对话框类头文件的消息函数声明域内声明我们的链接点击通知函数
afx_msg void OnRichEditLink(NMHDR* in_pNotifyHeader, LRESULT* out_pResult );
然后,在对话框的CPP文件中,把我们的点击链接的消息和我的响应函数映射起来
ON_NOTIFY(EN_LINK, IDC_RICHEDIT1, OnRichEditLink )
最后就是实现我们的响应函数了:
ENLINK* l_pENLink = ( ENLINK* )in_pNotifyHeader ;
*out_pResult = 0 ;
switch( l_pENLink->msg )
{
default:{}
break ;
case WM_LBUTTONDOWN://如果鼠标左键被点击
{
CString strURL ;
CHARRANGE crCharRange ;
CRichEdit * pTempEdit;
pTempEdit = (CRichEdit*)CRichEdit::FromHandle(l_pENLink->nmhdr.hwndFrom);
pTempEdit->GetSel( crCharRange ) ;//得到原来选中的字符
pTempEdit->SetSel( l_pENLink->chrg ) ;//设置RUL被选中
strURL = pTempEdit->GetSelText() ;//得到URL
pTempEdit->SetSel( crCharRange ) ;//恢复原来被选中的字符
CWaitCursor l_WaitCursor ;
//用当前默认的浏览器打URL
ShellExecute( this->GetSafeHwnd(), _T( "open" ),strURL, NULL, NULL, SW_SHOWNORMAL ) ;
*out_pResult = 1 ;
}
break ;
case WM_LBUTTONUP:
{
*out_pResult = 1 ;
}
break ;
}
就这么多了,没有了,编译运行吧。