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

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

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

【问题讨论】:

    标签: c++ winapi richedit


    【解决方案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。

    【讨论】:

    • 我不确定 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++ 中可行
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多