C++ 如何在RichEdit 2.0中自动检测URL?

C++ 如何在RichEdit 2.0中自动检测URL?,c++,winapi,richedit,C++,Winapi,Richedit,当我们有一个RichEdit控件并向它发送WPARAM设置为TRUE的EM_autourldetate消息时,它会很好地高亮显示检测到的URL并发送EN_链接通知。 但它只对输入控件的文本执行此操作。对于使用SetWindowText或EM\u STREAMIN加载到控件中的文本,我还没有找到这样做的方法。 请帮忙!谢谢 Upd: 我从头创建了一个测试应用程序,它在那里运行良好。我认为问题可能是我已经对控件进行了超类化,也就是说,创建了一个新的窗口类,并且只使用了原始类的窗口过程。我将尝试对控件

当我们有一个RichEdit控件并向它发送WPARAM设置为TRUE的
EM_autourldetate
消息时,它会很好地高亮显示检测到的URL并发送
EN_链接
通知。 但它只对输入控件的文本执行此操作。对于使用
SetWindowText
EM\u STREAMIN
加载到控件中的文本,我还没有找到这样做的方法。 请帮忙!谢谢

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

而不知道您试图使用SetWindowText和EM_STREAMIN添加到控件的文本格式。我将猜测一下,这可能与控件的文本模式有关。设置控件内容后,尝试向其发送消息,查看是否设置了TM_明文位。如果是这种情况,请尝试发送一条消息,后跟EM_autourldetve。您的代码应该如下所示:

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);

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

我刚刚开发了一个基于WTL对话框的应用程序,其中包含一个riched20控件,以下功能很好:

CRichEditCtrl richedit = GetDlgItem(IDC_RICHEDIT);
richedit.SetAutoURLDetect(TRUE);
richedit.SetWindowText(_T("http://www.stackoverflow.com"));
我有一些旧的MFC代码,它做了一些类似的事情,尽管使用的是ES_流,但它也可以正常工作

FWIW WTL
CRichEditCtrl
包装非常薄
SetAutoURLDetect
只需调用
SendMessage
传递它
EM\u AUTOURLDETECT


我在编译时将
\u RICHEDIT\u VER
设置为
0x0200
FWIW。

不幸的是,这不起作用:(这也是MSDN对EM_SETTEXTMODE的说法:“如果控件包含任何文本,消息将失败。”@Alex因此代码段将转到if(::SendMessage(句柄到控件,EM_SETTEXTMODE,textmode,0)!=0)然后失败了?首先它没有进入EM_SETTEXTMODE,因为textmode已经是TM_RICHTEXT。然后我手动将控件放入TM_纯文本模式,EM_SETTEXTMODE仍然失败。尝试清除文本并随后进行设置-也没有帮助:SETTEXTMODE成功,但未检测到链接((我不确定Alex是否还在监控这个问题,但我认为问题不只是设置url检测,而是在设置之前将其应用于控件中的文本。是的,确实如此。使用EM_AUTOURLDETECT,控件只检测手动输入的url。但在我上面的示例中,文本不是手动输入的(SetWindowText)并按预期工作。我有点困惑。你有一些示例代码吗?示例代码会涉及很多,因为我已经在WinApi上构建了一个小型OO框架。我想问题是我对控件进行了超类化(它有自己的窗口类,只使用原始控件的窗口过程)我不确定。你到底是怎么写的?“重写”。我在发送EMIAUTURLLIKE后设置控件的文本,但它不起作用。我在C++中遇到了一个例子:在这个例子中,他们重写了控件的.text属性。我不知道如何将其转换成C++,但是如果它在VB中是可行的,那么它应该是C++中可行的。