2011-06-01 147 views
1

我在对话框中有一个RichEdit控件。 RichEdit控件显示RTF文本。 EM_AUTOURLDETECT导致RichEdit控件正确格式化并识别超链接。当鼠标悬停在链接上时,指针变成一只手,但是一旦链接被点击,浏览器就不会启动。RichEdit的EM_AUTOURLDETECT消息识别链接,但我无法点击它

我是否缺少某种事件处理程序代码?

case WM_INITDIALOG: 
{ 
    // Create Richedit 
    HWND hwndRE = CreateWindowA("RichEdit20A", "", WS_CHILD | WS_BORDER | WS_VSCROLL | ES_READONLY | ES_MULTILINE, 10, 10, 480, 220, hDlgWnd, 0, hInst, 0); 

    SendMessage(hwndRE ,EM_AUTOURLDETECT,(WPARAM)TRUE,(LPARAM)0); 
    //SendMessage(hwndRE ,EM_SETEVENTMASK, 1, ENM_LINK | ENM_CHANGE); 

    ShowWindow(hwndRE, SW_SHOWNORMAL); 
    SETTEXTEX SetTextEx; 
    char* aboutdata = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Verdana;}}\\viewkind4\\uc1\\pard\\qc\\b\\f0\\fs20 www.whateverdomain.com} "); 
    SendMessage(hwndRE, EM_SETTEXTEX,(WPARAM)&SetTextEx, (LPARAM)(LPCTSTR)aboutdata); 
    return TRUE; 
} 

回答

3

你可以尝试这样的事情:

case WM_NOTIFY: 
    switch (((LPNMHDR)lParam)->code) 
    { 
     case EN_LINK: 
      ENLINK * enLinkInfo = (ENLINK *)lParam; 

      if (enLinkInfo->msg == WM_LBUTTONUP) 
      { 
       // code which gets clicked URL using enLinkInfo->chrg and saves it in 
       // "urlString" 

       ShellExecute(NULL, "open", urlString, NULL, NULL, SW_SHOWNORMAL); 
      } 
      break; 

     .... // More cases on WM_NOTIFY switch. 
    } 
    break; 

基本上,当WM_NOTIFY代码EN_LINK,你得到的点击网址并使用ShellExecute启动它。

+0

我设置了:SendMessage(hwndRE,EM_SETEVENTMASK,0,ENM_LINK);这使得能够发送EN_LINK消息。但是现在,当我将鼠标悬停在链接上(甚至不必点击),浏览器就会打开网站?而且你盘旋的时间越长,它打开的网站实例就越多...... – 2011-06-01 15:55:46

+0

EM_AUTOURLDETECT会自动修改丰富的编辑控件,以便它可以发送EN_LINK通知。您是否尝试调试代码以查看会发生什么?您的对话框是否收到来自富编辑控件的任何通知? – 2011-06-01 15:56:09

+0

对不起,如果这个双重职位,我正在编辑,而你打字。我设置了:SendMessage(hwndRE,EM_SETEVENTMASK,0,ENM_LINK);这使得能够发送EN_LINK消息。但是现在,当我将鼠标悬停在链接上(甚至不必点击),浏览器就会打开网站?而且你盘旋的时间越长,它打开的网站越多... – 2011-06-01 15:57:34