richedit實現超鏈接

 剛在做小飛鴿的文件傳送,要在richeidt上提示:XXX向你發送了XX文件,是 否接收,是和否都要使用超鏈接,

貼個代碼吧:

 

  1. int nTotalLen = m_EidtRecod.GetWindowTextLength();  
  2. m_EidtRecod.SetSel(nTotalLen, nTotalLen);  
  3. CString str;  
  4. str.Format(_T("%s 向你發送文件:%s 是否接受?\r\n        "), m_szName, pFile->m_szName);  
  5. m_EidtRecod.ReplaceSel((LPCTSTR)str);  
  6.   
  7. CHARFORMAT cf = {0};  
  8. cf.cbSize = sizeof(CHARFORMAT);  
  9. cf.dwMask = CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_UNDERLINE|CFM_UNDERLINETYPE|CFM_LINK  
  10. cf.dwEffects = CFE_LINK|CFE_UNDERLINE;  
  11. cf.crTextColor = RGB(255, 0, 0);   
  12.   
  13. // 設置超鏈接   
  14. nTotalLen = m_EidtRecod.GetWindowTextLength();  
  15. str.Format(_T("(Yes)是"));  
  16. m_EidtRecod.ReplaceSel((LPCTSTR)str);  
  17. int iEndPos = m_EidtRecod.GetWindowTextLength();  
  18. m_EidtRecod.SetSel(iEndPos-10, iEndPos);  
  19. m_EidtRecod.SetSelectionCharFormat(cf);  
  20.   
  21. // 設置超鏈接   
  22. m_EidtRecod.SetSel(iEndPos, iEndPos);  
  23. m_EidtRecod.ReplaceSel(_T("           "));  
  24. nTotalLen = m_EidtRecod.GetWindowTextLength();  
  25. m_EidtRecod.ReplaceSel(_T("(No)否"));  
  26. iEndPos = m_EidtRecod.GetWindowTextLength();  
  27. m_EidtRecod.SetSel(iEndPos-10, iEndPos);  
  28. m_EidtRecod.SetSelectionCharFormat(cf);  
  29.   
  30. m_EidtRecod.SetSel(iEndPos, iEndPos);  
  31. m_EidtRecod.ReplaceSel(_T("\r\n"));  
  32.   
  33. // 使RichEdit響應ENM_LINK事件   
  34. m_EidtRecod.SetEventMask(ENM_LINK);  
  35. m_EidtRecod.LineScroll(1);  
	int nTotalLen = m_EidtRecod.GetWindowTextLength();
	m_EidtRecod.SetSel(nTotalLen, nTotalLen);
	CString str;
	str.Format(_T("%s 向你發送文件:%s 是否接受?\r\n        "), m_szName, pFile->m_szName);
	m_EidtRecod.ReplaceSel((LPCTSTR)str);

	CHARFORMAT cf = {0};
	cf.cbSize = sizeof(CHARFORMAT);
	cf.dwMask = CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_UNDERLINE|CFM_UNDERLINETYPE|CFM_LINK
	cf.dwEffects = CFE_LINK|CFE_UNDERLINE;
	cf.crTextColor = RGB(255, 0, 0); 

	// 設置超鏈接
	nTotalLen = m_EidtRecod.GetWindowTextLength();
	str.Format(_T("(Yes)是"));
	m_EidtRecod.ReplaceSel((LPCTSTR)str);
	int iEndPos = m_EidtRecod.GetWindowTextLength();
	m_EidtRecod.SetSel(iEndPos-10, iEndPos);
	m_EidtRecod.SetSelectionCharFormat(cf);

	// 設置超鏈接
	m_EidtRecod.SetSel(iEndPos, iEndPos);
	m_EidtRecod.ReplaceSel(_T("           "));
	nTotalLen = m_EidtRecod.GetWindowTextLength();
	m_EidtRecod.ReplaceSel(_T("(No)否"));
	iEndPos = m_EidtRecod.GetWindowTextLength();
	m_EidtRecod.SetSel(iEndPos-10, iEndPos);
	m_EidtRecod.SetSelectionCharFormat(cf);

	m_EidtRecod.SetSel(iEndPos, iEndPos);
	m_EidtRecod.ReplaceSel(_T("\r\n"));

	// 使RichEdit響應ENM_LINK事件
	m_EidtRecod.SetEventMask(ENM_LINK);
	m_EidtRecod.LineScroll(1);


父類加個消息映射:

  1. afx_msg void OnLink(LPNMHDR pnmh, LRESULT *pResult);  
afx_msg void OnLink(LPNMHDR pnmh, LRESULT *pResult);
  1. ON_NOTIFY(EN_LINK, IDC_RICHEDIT_RECODE, OnLink)  
ON_NOTIFY(EN_LINK, IDC_RICHEDIT_RECODE, OnLink)
  1. void XXX::OnLink(LPNMHDR pnmh, LRESULT *pResult)  
  2. {  
  3.     ENLINK *pEnLink = (ENLINK *)pnmh;  
  4.     if(pEnLink->msg == WM_LBUTTONDOWN)  
  5.     {  
  6.         m_EidtRecod.SetSel(pEnLink->chrg);  
  7.         CString strLink = m_EidtRecod.GetSelText();  
  8.   
  9.         if (-1 != strLink.Find(_T("是")))  
  10.         {  
  11.               
  12.   
  13.         }  
  14.         else if(-1 != strLink.Find(_T("否")))  
  15.         {  
  16.               
  17.         }  
  18.   
  19.     }  
  20.   
  21.     pResult = 0;  
  22.   
  23. }  
void XXX::OnLink(LPNMHDR pnmh, LRESULT *pResult)
{
	ENLINK *pEnLink = (ENLINK *)pnmh;
	if(pEnLink->msg == WM_LBUTTONDOWN)
	{
		m_EidtRecod.SetSel(pEnLink->chrg);
		CString strLink = m_EidtRecod.GetSelText();

		if (-1 != strLink.Find(_T("是")))
		{
			

		}
		else if(-1 != strLink.Find(_T("否")))
		{
			
		}

	}

	pResult = 0;

}


也可以子類化richeidt,通過消息反射函數。

 

再貼個超鏈接通用的代碼吧:


 

  1. DWORD Mask = m_edit.GetEventMask();  
  2.     Mask = Mask | ENM_LINK  | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS | ENM_KEYEVENTS;  
  3.     m_edit.SetEventMask(Mask);   
  4.     ::SendMessage(m_edit.m_hWnd, EM_AUTOURLDETECT, true, 0);  
  5.   
  6.     m_edit.SetWindowText(_T("12222 www.baidu.com ooooie\r\nddfdf www.baidu.com kkkdkf"));  
DWORD Mask = m_edit.GetEventMask();
	Mask = Mask | ENM_LINK  | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS | ENM_KEYEVENTS;
	m_edit.SetEventMask(Mask); 
    ::SendMessage(m_edit.m_hWnd, EM_AUTOURLDETECT, true, 0);

	m_edit.SetWindowText(_T("12222 www.baidu.com ooooie\r\nddfdf www.baidu.com kkkdkf"));


這樣所有的www.什麼的都變藍色加下劃線

再加個響應代碼

  1. ON_NOTIFY(EN_LINK, IDC_RICHEDIT21, OnLink)  
ON_NOTIFY(EN_LINK, IDC_RICHEDIT21, OnLink)

  1. void XXXDlg::OnLink(LPNMHDR pnmh, LRESULT *pResult)  
  2. {  
  3.     ENLINK* pLink = ( ENLINK* )pnmh ;  
  4.     *pResult = 0;  
  5.     switch (pLink->msg)  
  6.     {  
  7.     case WM_LBUTTONDOWN://如果鼠標左鍵被點擊   
  8.         {  
  9.             CString strURL;  
  10.             CHARRANGE crCharRange;  
  11.             CRichEditCtrl * pTempEdit = (CRichEditCtrl*)CRichEditCtrl::FromHandle(pLink->nmhdr.hwndFrom);  
  12.             pTempEdit->GetSel(crCharRange);      //得到原來選中的字符   
  13.             pTempEdit->SetSel(pLink->chrg);       //設置RUL被選中   
  14.   
  15.             strURL = pTempEdit->GetSelText();    //得到URL   
  16.             pTempEdit->SetSel( crCharRange );    //恢復原來被選中的字符   
  17.             CWaitCursor l_WaitCursor ;          //用當前默認的瀏覽器打URL   
  18.             ShellExecute(this->GetSafeHwnd(), _T("open"), strURL, NULL, NULL, SW_SHOWNORMAL);  
  19.             *pResult = 1;  
  20.         }  
  21.         break ;  
  22.   
  23.     case WM_LBUTTONUP:  
  24.         {  
  25.             *pResult = 1;  
  26.         }  
  27.         break ;  
  28.   
  29.     default:  
  30.             break ;  
  31.     }  
  32. }  
void XXXDlg::OnLink(LPNMHDR pnmh, LRESULT *pResult)
{
	ENLINK* pLink = ( ENLINK* )pnmh ;
	*pResult = 0;
	switch (pLink->msg)
	{
	case WM_LBUTTONDOWN://如果鼠標左鍵被點擊
		{
			CString strURL;
			CHARRANGE crCharRange;
			CRichEditCtrl * pTempEdit = (CRichEditCtrl*)CRichEditCtrl::FromHandle(pLink->nmhdr.hwndFrom);
			pTempEdit->GetSel(crCharRange);		//得到原來選中的字符
			pTempEdit->SetSel(pLink->chrg);		//設置RUL被選中

			strURL = pTempEdit->GetSelText();	//得到URL
			pTempEdit->SetSel( crCharRange );	//恢復原來被選中的字符
			CWaitCursor l_WaitCursor ;			//用當前默認的瀏覽器打URL
			ShellExecute(this->GetSafeHwnd(), _T("open"), strURL, NULL, NULL, SW_SHOWNORMAL);
			*pResult = 1;
		}
		break ;

	case WM_LBUTTONUP:
		{
			*pResult = 1;
		}
		break ;

	default:
			break ;
	}
}

收工.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章