0

当我们有一个 RichEdit 控件并向其发送EM_AUTOURLDETECT一条 WPARAM 设置为 TRUE 的消息时,它会很好地突出显示检测到的 URL 并发送EN_LINK通知。但它只对输入到控件中的文本执行此操作。SetWindowText对于使用或加载到控件中的文本,我还没有找到方法EM_STREAMIN。请帮忙!谢谢

更新: 我从头开始创建了一个测试应用程序,它在那里运行良好。我认为问题可能是我对控件进行了超类化,即创建了一个新的窗口类,并且只使用了原始类的窗口过程。我将尝试对控件进行子类化..

4

3 回答 3

1

我刚刚打开了一个基本的基于 WTL 对话框的应用程序,其中包含一个riched20 控件,以下工作正常:

CRichEditCtrl richedit = GetDlgItem(IDC_RICHEDIT);
richedit.SetAutoURLDetect(TRUE);
richedit.SetWindowText(_T("http://www.stackoverflow.com"));

我有一些旧的 MFC 代码可以做类似的事情,尽管使用 ES_STREAM,它也可以正常工作。

FWIW WTLCRichEditCtrl包装器非常薄。 SetAutoURLDetect简单地调用SendMessage传递它EM_AUTOURLDETECT

我正在编译_RICHEDIT_VER设置为0x0200FWIW。

于 2009-04-08T13:06:52.157 回答
0

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

于 2009-04-08T04:32:48.443 回答
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);
于 2009-01-25T21:27:57.790 回答