如何在 RichEdit 2.0 中自动检测 url?

Posted

技术标签:

【中文标题】如何在 RichEdit 2.0 中自动检测 url?【英文标题】:How to autodetect urls in RichEdit 2.0? 【发布时间】:2009-01-25 19:14:34 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

我有一些旧的 MFC 代码可以执行类似的操作,尽管使用 ES_STREAM,但它也可以正常工作。

FWIW WTL CRichEditCtrl 包装器非常薄。 SetAutoURLDetect 只需调用 SendMessage 传递它 EM_AUTOURLDETECT

我正在编译时将_RICHEDIT_VER 设置为0x0200 FWIW。

【讨论】:

我不确定 Alex 是否仍在监视该问题,但我认为问题不仅在于设置 url 检测,还在于在设置之前将其应用于控件中的文本。跨度> 是的,就是这样。使用 EM_AUTOURLDETECT,控件只检测手动输入的 URL。 但在我上面的示例中,文本不是手动输入的 (SetWindowText),它按预期工作。我有点困惑。你有一些示例代码吗? 示例代码会涉及很多,因为我已经在 WinApi 之上构建了一个 mini-OO-Framework。我想问题是我已经对控件进行了超类化(它有自己的窗口类并且只使用原始控件的窗口过程),但我不确定..【参考方案2】:

在不知道您尝试使用 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);

【讨论】:

不幸的是,这不起作用:(这也是 MSDN 关于 EM_SETTEXTMODE 的说法:“如果控件包含任何文本,则消息失败。” @Alex 所以代码 sn-p 到达 if(::SendMessage(handle_to_control, EM_SETTEXTMODE, textmode, 0) != 0) 然后失败了? 首先它没有到达 EM_SETTEXTMODE,因为 textmode 已经是 TM_RICHTEXT。然后我手动将控件置于 TM_PLAINTEXT 模式,EM_SETTEXTMODE 仍然失败。尝试清除文本并随后对其进行设置 - 也无济于事:SETTEXTMODE 成功,但未检测到链接((【参考方案3】:

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

【讨论】:

“重写”到底是什么意思?我在发送 EM_AUTOURLDETECT 后设置控件的文本,但它不起作用。 我在 VB 中遇到了一个示例:vbforums.com/archive/index.php/t-59959.html 在该示例中,他们重写了控件的 .Text 属性。我不确定这如何转换为 C++,但如果它在 VB 中可行,它应该在 C++ 中可行

以上是关于如何在 RichEdit 2.0 中自动检测 url?的主要内容,如果未能解决你的问题,请参考以下文章

来自资源的CRichEditCtrl加载1.0而不是2.0

如何在 JPA 2.0 中自动检测实体

RichEdit 2.0 使用单个 CR 字符作为换行符会引发 SelStart 计算(Delphi XE2)

VC2008下CRichEditView加载RichEdit4.1版本(还有一些类似的文章)

如何在MFC中使用richedit控件_RICHEDIT_VER over 2.1

delphi 如何把RichEdit的滚动条移动到指定行?