How to autodetect urls in RichEdit 2.0?

[亡魂溺海] 提交于 2019-12-20 06:36:53

问题


When we have a RichEdit control and send it an EM_AUTOURLDETECT message with WPARAM set to TRUE, it nicely hightlights the detected URLs and sends the EN_LINK notifications. But it does this only for text that is entered into the control. I haven't found the way to do it for text that's loaded into the control with SetWindowText or EM_STREAMIN. Please help! Thanks

Upd: I've created a test application from scratch and it works fine there. I think the problem might be that I have superclassed the control, that is, created a new window class and just use the window procedure of the original class. I'm gonna try subclassing the control instead..


回答1:


I just knocked up a basic WTL dialog based app containing a riched20 control and the following works fine:

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

I have some old MFC code that does something similar, albeit with ES_STREAM, and it works OK too.

FWIW the WTL CRichEditCtrl wrapper is pretty thin. SetAutoURLDetect simply calls SendMessage passing it EM_AUTOURLDETECT.

I am compiling with _RICHEDIT_VER set to 0x0200 FWIW.




回答2:


Without knowing the format of the text you are trying to add to the control with SetWindowText and EM_STREAMIN I'm going to take a guess and say this might have something to do with the control's text mode. After setting the contents of the control try sending it a EM_GETTEXTMODE message and see if the TM_PLAINTEXT bit is set. If this is the case then try sending a EM_SETTEXTMODE message followed by EM_AUTOURLDETECT. Your code should look something like this:

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



回答3:


You might just have to rewrite the text to the control to get it to re-parse.



来源:https://stackoverflow.com/questions/478071/how-to-autodetect-urls-in-richedit-2-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!