这个其实网上能找到不少的例子,包括mfc的例子都可以参考,捣鼓一下就出来了。刚好有个网友问这个实现,干脆整个例子备忘,也方便大家参考。以下duilib基于仓库代码。duilib: 【此项目由(https://github.com/juhuaguai/duilib)而来,一般更新都在github,不定时会同步到这里。】:由官方的duilib( https://github.com/duilib/duilib ) 复制过来的,仅为了个人学习使用。可以使用vs2008打开,新增一些学习测试用的demo,代码也会同步官方的后续修改。仓库https://gitee.com/juhuaguai_net/duilib
第一步,给richedit增加eventmask,让他能够处理Link事件。
CRichEditUI* pEdit = static_cast<CRichEditUI*>(m_PM.FindControl(_T("testLink")));
DWORD dwEventMast = pEdit->GetEventMask();
dwEventMast = dwEventMast | ENM_LINK;
pEdit->SetEventMask(dwEventMast);
第二步,添加超链接的文本,并且选中它。
int nStart = pEdit->GetTextLength();
CDuiString strText = L"xx一下,你就知道!";
pEdit->AppendText(strText.GetData());
int nEnd = pEdit->GetTextLength();
pEdit->SetSel(nStart,nEnd);
第三步,给选中的文本设置超链格式。
CHARFORMAT2 cf;
ZeroMemory(&cf, sizeof(CHARFORMAT2));
cf.cbSize = sizeof(cf);
cf.dwMask = CFM_LINK;
cf.dwEffects = cf.dwEffects|CFE_LINK;
pEdit->SetSelectionCharFormat(cf);
第四步,光标移到末尾(选中末尾),取消超链格式,避免格式粘连到后续的文本。
pEdit->SetSel(-1,-1);
CHARFORMAT2 cfc;
ZeroMemory(&cfc, sizeof(CHARFORMAT2));
cfc.dwMask = CFM_LINK;
pEdit->SetSelectionCharFormat(cfc);
可以再后续通过pEdit->AppendText(L"点击试试看吧");函数继续追加其他文本。
超链设置完毕。接下来去响应,只要在duilib的Notify里面去响应DUI_MSGTYPE_LINK即可。
if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
{
InitDlg();
}
else if ( msg.sType == DUI_MSGTYPE_CLICK)
{
}
else if (msg.sType == DUI_MSGTYPE_LINK)
{
if (msg.pSender->GetName() == L"testLink")
{
ENLINK* pEnLink = (ENLINK *)(msg.lParam);
CRichEditUI* pEdit = (CRichEditUI*)(msg.pSender);
CDuiString strLinkText = pEdit->GetTextRange(pEnLink->chrg.cpMin,pEnLink->chrg.cpMax);
if (strLinkText == L"xx一下,你就知道!")
{
ShellExecute(NULL,_T("open"),L"https://cn.bing.com",_T(""),_T(""),SW_SHOWNORMAL);
}
}
}
整个处理流程就是这样。
另外,
从上面可以看出来,richedit支持多个超链接的识别的办法,就是通过文本内容或者说是charRange来识别的,至于有无其他识别的办法,我目前还不知道。
超链接响应时用到的数据,需要自己找地方另存(当然你也可以像示例那样直接)。
想要超链文本或者richedit的文本显示更多花骚的富文本样式,其实跟超链差不多做法,就是选中要花梢的文本,然后设置这段文本的样式(字体,颜色,字号,加粗,倾斜,下划线删除线等等,具体请参看CHARFORMAT2)