Как автоматически определить URL в RichEdit 2.0? - PullRequest
0 голосов
/ 25 января 2009

Когда у нас есть элемент управления RichEdit и мы отправляем ему сообщение EM_AUTOURLDETECT с WPARAM, установленным в значение ИСТИНА, он приятно выделяет обнаруженные URL-адреса и отправляет уведомления EN_LINK. Но он делает это только для текста, который вводится в элемент управления. Я не нашел способ сделать это для текста, который загружается в элемент управления с SetWindowText или EM_STREAMIN. Пожалуйста помоги! Спасибо

Upd: Я создал тестовое приложение с нуля, и оно отлично работает там. Я думаю, что проблема может заключаться в том, что я переклассифицировал элемент управления, то есть создал новый класс окна и просто использовал процедуру окна исходного класса. Вместо этого я попытаюсь создать подкласс управления ...

Ответы [ 3 ]

1 голос
/ 08 апреля 2009

Я только что выбил базовое приложение на основе диалогового окна 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 голосов
/ 08 апреля 2009

Возможно, вам придется просто переписать текст в элемент управления, чтобы его можно было повторно проанализировать.

0 голосов
/ 26 января 2009

Не зная формата текста, который вы пытаетесь добавить в элемент управления с помощью 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);
...