43.VC(custom)-richedit实现超链接(随手代码)

 刚在做小飞鸽的文件传送,要在richeidt上提示:XXX向你发送了XX文件,是 否接收,是和否都要使用超链接,

贴个代码吧:

	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);

父类加个消息映射:

afx_msg void OnLink(LPNMHDR pnmh, LRESULT *pResult);
ON_NOTIFY(EN_LINK, IDC_RICHEDIT_RECODE, OnLink)
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,通过消息反射函数。

再贴个超链接通用的代码吧:

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.什么的都变蓝色加下划线

再加个响应代码

ON_NOTIFY(EN_LINK, IDC_RICHEDIT21, OnLink)
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 ;
	}
}

收工.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值