2012-07-09 70 views
4

網址,鼠標點擊我添加了豐富的只讀編輯2.0控制,以我的對話框如何實現在豐富的編輯控制

在(代碼是用C窗戶API,通過使用功能DialogBox創建對話框)對話框回調,在WM_INITDIALOG,我添加以下代碼,使URL檢測,也使ENM_LINK被髮送到父對話,而不是豐富的編輯控件本身的事件:

LRESULT mask = SendMessage(hWndText, EM_GETEVENTMASK, 0, 0); //hWndText is rich edit control 
SendMessage(hWndText, EM_SETEVENTMASK, 0, mask | ENM_LINK); 
::SendMessage(hWndText, EM_AUTOURLDETECT, TRUE, NULL); 

我有一個小麻煩啓用對話框初始啓動時的URL檢測(這似乎是一個已知問題或行爲,因爲富編輯控件只會啓用修改後的文本的網址檢測)。不過,我通過在每個WM_PAINT事件上再次設置對話框文本來解決此問題。

該代碼一般工作。我也實施了下面的代碼在瀏覽器中啓動URL當鼠標懸停在鏈接:

case WM_NOTIFY: 
    plink = (ENLINK *) lParam; 
    switch(LOWORD(wParam)) 
    { 
     case IDC_DISPLAY_TEXT_2: //this is ID for my rich edit control 
      szURL =m_strDisplay.Mid(plink->chrg.cpMin, plink->chrg.cpMax - plink->chrg.cpMin);   
      LaunchURL(szURL); //function to launch the url with default browser 
      break; 
     default: 
      break; 
    } 

看來,我會每次都獲得WM_NOTIFY事件,當我徘徊在鼠標的URL。但是,當我點擊它時,我總是得到與鼠標懸停在同一事件。

根據ENLINK的結構,我應該在NMHDR結構中得到更詳細的NM事件,但是plink-> nmhdr.code始終爲1803,甚至不是NM_HOVER(其定義值爲(NM_FIRST-13)和NM_FIRST是(0U-0U),所以我的64位機器上的NM_HOVER值是4294967283)。我知道我在這裏失去了一些東西。有人可以在這裏點亮一些燈嗎?如何獲得豐富的編輯控件的鼠標點擊事件?

+0

另請參閱[在RichEdit中檢測URL的檢測](http://stackoverflow.com/q/2480173/850848)。 – 2016-01-16 08:44:05

回答

7

我想你應該捕獲EN_LINK通知。我實現了下面的代碼。它可以將放入父窗口的RichEdit控件中的url鏈接,而不是放入對話框中。你也可以調整它以適應你的對話。

考慮的代碼開頭:

case WM_NOTIFY: { 
switch (((LPNMHDR)lParam)->code) { //NMHDR structure contains information about a notification message. 
     case EN_LINK: { 
      ENLINK *enLinkInfo = (ENLINK *)lParam; // pointer to a ENLINK structure 

那麼,如果你選擇在LBUTTONUP啓動URL,你必須檢查包含在enLinkInfo->msg值(記得要適應它爲你的對話,雖然)

if (enLinkInfo->msg == WM_LBUTTONUP) { 
// select all the text from enLinkInfo->chrg.cpMin to enLinkInfo->chrg.cpMax 
// lauch the url 

} 

此外,你可以攔截WM_MOUSEMOVE:

if(enLinkInfo->msg == WM_MOUSEMOVE) { 
       ; // do nothing 
} 

希望它有幫助。

+0

謝謝。這解決了我的鼠標點擊問題。 – windfly2006 2012-07-09 17:38:07

+0

我可以看到增加的值 - 檢查'enLinkInfo-> msg'。好點子。 – krlmlr 2012-07-09 19:31:10

2

根據EM_AUTOURLDETECT的文檔,您應該獲得EN_LINK通知,這應該反映在nmhdr.code中。據谷歌稱,

#define EN_LINK 0x70B 

這是7 * 256 + 11 = 1750 + 42 + 11 = 1803

請注意,您的代碼未命中nmhdr.code == EN_LINK檢查。

我不確定控件是否發送NM_HOVER消息。

+0

謝謝,這解釋了我所看到的。 – windfly2006 2012-07-09 17:37:55

3

的答案被@ A_nto2顯示,攔截鼠標點擊操作:

case WM_NOTIFY: { 
    //NMHDR structure contains information about a notification message. 
    switch (((LPNMHDR)lParam)->code) { 
     case EN_LINK: { 
      ENLINK *enLinkInfo = (ENLINK *)lParam; // pointer to a ENLINK structure 
      if (enLinkInfo->msg == WM_LBUTTONUP) { 

但棘手的部分是讓被點擊的鏈接。

我們得到enLinkInfo->chrgCHARRANGE類型中點擊的「範圍」。

Detect click on URL in RichEdit的回答建議使用EM_EXSETSELenLinkInfo->chrg。然後使用EM_GETSELTEXT來檢索文本。

適用於自動檢測到的純文本URL(EM_AUTOURLDETECT)。

的一個問題是與友好的名稱鏈接(即那些具有比URL本身不同的錨文本):(這些都在豐富的編輯4.1和更高版本僅支持注)

{\rtf1{\field{\*\fldinst{ HYPERLINK "https://www.example.com"}}{\fldrslt{Example}}}} 

對於這些,CHARRANGE指向HYPERLINK "https://www.example.com"部分,該部分是隱藏的,無法使用EM_EXSETSEL進行選擇。實際上它可以在Windows 10上進行選擇。但不能在Windows 7,Vista和XP上選擇。將EM_EXSETSEL發送到這些系統會導致在隱藏部分之後選擇一個零長度塊。

所以要麼你必須回到豐富的編輯緩衝區並掃描鏈接;或者使用其他方法來檢索點擊的文本。

就我而言,由於我只在富文本編輯中有小文本,因此我使用了WM_GETTEXT。它返回豐富的編輯文檔的純文本版本,但以這種形式保存的友好名稱鏈接:

HYPERLINK "https://www.example.com" Example 

CHARRANGE指向的URL,包括奇怪的龍頭報價:("https://www.example.com)。

但索引對應於帶有單字符(LF)行分隔符的文本。而WM_GETTEXT返回CRLF分隔符。因此,在使用CHARRANGE提取URL之前,必須將文本轉換爲LF。

+0

感謝「超鏈接」 – Sakura 2016-02-11 00:26:30

相關問題