当我们有一个 RichEdit 控件并向其发送一条 WPARAM 设置为 TRUE 的
EM_AUTOURLDETECT
消息时,它会很好地突出显示检测到的 URL 并发送 EN_LINK
通知。
但它仅对输入到控件中的文本执行此操作。我还没有找到使用 SetWindowText
或 EM_STREAMIN
加载到控件中的文本的方法。
请帮忙!谢谢
更新: 我从头开始创建了一个测试应用程序,它运行良好。我认为问题可能是我对控件进行了超类化,即创建了一个新的窗口类并仅使用原始类的窗口过程。我将尝试对控件进行子类化..
我刚刚构建了一个基于 WTL 对话框的基本应用程序,其中包含 riched20 控件,并且以下工作正常:
CRichEditCtrl richedit = GetDlgItem(IDC_RICHEDIT);
richedit.SetAutoURLDetect(TRUE);
richedit.SetWindowText(_T("http://www.stackoverflow.com"));
我有一些旧的 MFC 代码可以做类似的事情,尽管是使用 ES_STREAM,而且它也可以正常工作。
FWIW WTL
CRichEditCtrl
包装纸非常薄。 SetAutoURLDetect
只需调用 SendMessage
并传递它 EM_AUTOURLDETECT
。
我正在将
_RICHEDIT_VER
设置为 0x0200
FWIW 进行编译。
在不知道您尝试使用 SetWindowText 和 EM_STREAMIN 添加到控件的文本格式的情况下,我将猜测并说这可能与控件的文本模式有关。设置控件的内容后,尝试向其发送 EM_GETTEXTMODE 消息,并查看 TM_PLAINTEXT 位是否已设置。如果是这种情况,请尝试发送 EM_SETTEXTMODE 消息,然后发送 EM_AUTOURLDETECT。你的代码应该是这样的:
UINT textmode = (UINT)::SendMessage(handle_to_control, EM_GETTEXTMODE, 0, 0);
if(textmode & TM_PLAINTEXT) {
textmode &= ~TM_PLAINTEXT; // Clear the TM_PLAINTEXT bit
textmode |= TM_RICHTEXT; // Set the TM_RICHTEXT bit
if(::SendMessage(handle_to_control, EM_SETTEXTMODE, textmode, 0) != 0) {
// Failed to set the text mode
}
}
::SendMessage(handle_to_control, EM_AUTOURLDETECT, TRUE, 0);
您可能只需将文本重写到控件即可重新解析。
我能够通过(https://forums.codeguru.com/showthread.php?81261-How-do-I-enable-my-richeditview-receive-EN_LINK-massages)的线索让它发挥作用.
在标题中
BOOL b_button = FALSE;
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnEnLink(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
来源
void CXXXView::OnInitialUpdate()
{
CRichEditView::OnInitialUpdate();
CRichEditCtrl& wndRichEdit = GetRichEditCtrl();
wndRichEdit.SetAutoURLDetect(TRUE);
wndRichEdit.SetEventMask(ENM_LINK);
}
void CXXXView::OnEnLink(NMHDR* pNMHDR, LRESULT* pResult)
{
if (b_button == TRUE)
{
b_button = FALSE;
ENLINK* pEnProtected = reinterpret_cast<ENLINK*>(pNMHDR);
CString cs;
GetWindowText(cs);
LONG cpMin = pEnProtected->chrg.cpMin;
LONG cpMax = pEnProtected->chrg.cpMax;
cs = cs.Mid(cpMin, cpMax - cpMin);
ShellExecute(0, "open", cs, 0, 0, SW_SHOW);
}
}
void CXXXView::OnLButtonDown(UINT nFlags, CPoint point)
{
b_button = TRUE;
CRichEditView::OnLButtonDown(nFlags, point);
}
void CXXXView::OnLButtonUp(UINT nFlags, CPoint point)
{
b_button = FALSE;
CRichEditView::OnLButtonUp(nFlags, point);
}