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

问题描述 投票:0回答:4

当我们有一个 RichEdit 控件并向其发送一条 WPARAM 设置为 TRUE 的

EM_AUTOURLDETECT
消息时,它会很好地突出显示检测到的 URL 并发送
EN_LINK
通知。 但它仅对输入到控件中的文本执行此操作。我还没有找到使用
SetWindowText
EM_STREAMIN
加载到控件中的文本的方法。 请帮忙!谢谢

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

c++ winapi richedit
4个回答
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 进行编译。


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

0
投票

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


0
投票

我能够通过(https://forums.codeguru.com/showthread.php?81261-How-do-I-enable-my-richeditview-receive-EN_LINK-massages)的线索让它发挥作用.

在标题中

BOOL b_button = FALSE;

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnEnLink(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()

来源

void CXXXView::OnInitialUpdate()
{
    CRichEditView::OnInitialUpdate();
    CRichEditCtrl& wndRichEdit = GetRichEditCtrl();
    wndRichEdit.SetAutoURLDetect(TRUE);
    wndRichEdit.SetEventMask(ENM_LINK);
}

void CXXXView::OnEnLink(NMHDR* pNMHDR, LRESULT* pResult)
{
    if (b_button == TRUE)
    {
        b_button = FALSE;
        ENLINK* pEnProtected = reinterpret_cast<ENLINK*>(pNMHDR);
        CString cs;
        GetWindowText(cs);
        LONG cpMin = pEnProtected->chrg.cpMin;
        LONG cpMax = pEnProtected->chrg.cpMax;
        cs = cs.Mid(cpMin, cpMax - cpMin);
        ShellExecute(0, "open", cs, 0, 0, SW_SHOW);
    }
}

void CXXXView::OnLButtonDown(UINT nFlags, CPoint point)
{
    b_button = TRUE;
    CRichEditView::OnLButtonDown(nFlags, point);
}

void CXXXView::OnLButtonUp(UINT nFlags, CPoint point)
{
    b_button = FALSE;
    CRichEditView::OnLButtonUp(nFlags, point);
}
© www.soinside.com 2019 - 2024. All rights reserved.