如何在RichEdit 2.0中自动检测网址?

时间:2009-01-25 19:14:35

标签: c++ winapi richedit

当我们有RichEdit控件并向其发送EM_AUTOURLDETECT消息并将WPARAM设置为TRUE时,它会很好地高亮检测到的URL并发送EN_LINK通知。 但它仅对输入控件的文本执行此操作。对于使用SetWindowTextEM_STREAMIN加载到控件中的文本,我还没有找到方法。 请帮忙!感谢

UPD: 我从头开始创建了一个测试应用程序,它在那里工作正常。我认为问题可能是我已经超级控制了控件,即创建了一个新的窗口类并且只使用原始类的窗口过程。我要尝试子类化控件而不是..

3 个答案:

答案 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)

您可能只需要将文本重写为控件以使其重新解析。