最近在寫一個工具,需要用到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 ;
}
}