最近在写一个工具,需要用到RichEditCtrl控件,这个控件需要支持图片和URL超链接功能。
查看了Codeguru和codeproject网站中文章的描述,其中实现的主要部分代码如下。
if (FAILED(CoInitialize(NULL)))
{
return ;
}
HBITMAP hBitmap =(HBITMAP)LoadImage
(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CImageDataObject::InsertBitmap(m_GameIntroduce.GetIRichEditOle(), hBitmap);
CoUninitialize();
CImageDataObject类 我的资源中RichEditCtrl添加图片中可以下到。
让RichEditCtrl支持超链接,可以使用下面的代码。也可以使用CRichEditCtrl中的成员函数来实现。主要代码如下。
//使得richedit支持超链接
DWORD Mask = m_GameIntroduce.GetEventMask();
Mask = Mask | ENM_LINK | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS | ENM_KEYEVENTS;
m_GameIntroduce.SetEventMask(Mask);
::SendMessage(m_GameIntroduce.m_hWnd, EM_AUTOURLDETECT, true, 0);
在消息映射中加入
ON_NOTIFY(EN_LINK,IDC_GAME_INTRODUCE,OnRichEditLink)
超链接实现代码
OnRichEditLink(NMHDR* in_pNotifyHeader, LRESULT* out_pResult )
{
ENLINK* l_pENLink = ( ENLINK* )in_pNotifyHeader ;
*out_pResult = 0 ;
switch( l_pENLink->msg )
{
default:{}
break ;
case WM_LBUTTONDOWN://如果鼠标左键被点击
{
CString strURL ;
CHARRANGE crCharRange ;
CRichEditCtrl * pTempEdit;
pTempEdit = (CRichEditCtrl *)CRichEditCtrl ::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 ;
}
}