2009-01-25 48 views
0

當我們有一個RichEdit控件併發送一個EM_AUTOURLDETECT消息並將WPARAM設置爲TRUE時,它很好地突出了檢測到的URL併發送了EN_LINK通知。 但它僅對輸入到控件中的文本執行此操作。我還沒有找到方法來處理用SetWindowTextEM_STREAMIN加載到控件中的文本。 請幫忙!謝謝如何在RichEdit 2.0中自動檢測網址?

Upd: 我從頭開始創建一個測試應用程序,它在那裏工作得很好。我認爲問題可能是我超級控制,即創建一個新的窗口類,並使用原始類的窗口過程。我會嘗試子類化控制,而不是..

回答

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

不幸的是,這並沒有工作:(這也是MSDN關於EM_SETTEXTMODE所說的:「如果控件包含任何文本,則消息失敗。」 – 2009-01-26 05:07:06

+0

@Alex所以代碼片段獲取if(:: SendMessage(handle_to_control, EM_SETTEXTMODE,textmode,0)!= 0),然後失敗? – 2009-01-26 17:37:23

+0

首先它沒有得到EM_SETTEXTMODE,因爲textmode已經是TM_RICHTEXT。然後手動將控件置於TM_PLAINTEXT模式,EM_SETTEXTMODE仍然失敗。嘗試清除文本然後設置它 - 沒有任何幫助:SETTEXTMODE成功,但沒有檢測到鏈接(( – 2009-01-27 17:45:47

0

你可能只需要重寫文本到控件來重新解析。

1

我只是敲了含有riched20控制基本的WTL基於對話框的應用程序,以下工作正常:

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。