当我们有RichEdit控件并向其发送EM_AUTOURLDETECT
消息并将WPARAM设置为TRUE时,它会很好地高亮检测到的URL并发送EN_LINK
通知。
但它仅对输入控件的文本执行此操作。对于使用SetWindowText
或EM_STREAMIN
加载到控件中的文本,我还没有找到方法。
请帮忙!感谢
UPD: 我从头开始创建了一个测试应用程序,它在那里工作正常。我认为问题可能是我已经超级控制了控件,即创建了一个新的窗口类并且只使用原始类的窗口过程。我要尝试子类化控件而不是..
答案 0 :(得分:1)
我刚刚敲了一个基于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。
答案 1 :(得分:0)
在不知道您尝试使用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);
答案 2 :(得分:0)
您可能只需要将文本重写为控件以使其重新解析。