我在对话框中添加了一个只读的 Rich Edit 2.0 控件(代码使用 C windows 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 检测有点麻烦(这似乎是一个已知问题或行为,因为富编辑控件只会启用修改文本的 url 检测)。但是,我通过在每个 WM_PAINT 事件上再次设置对话框文本来解决此问题。
该代码通常可以正常工作。当鼠标悬停在 URL 上时,我还实现了以下代码以在浏览器中启动 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;
}
似乎每次将鼠标悬停在 url 上时,我都会收到 WM_NOTIFY 事件。但是,当我单击它时,我总是得到与鼠标悬停相同的事件。
基于ENLINK的结构,我应该在 NMHDR 结构中获得更详细的 NM 事件,但是值 plink->nmhdr.code 始终是 1803,甚至不是 NM_HOVER (它的定义值是 (NM_FIRST-13) 而 NM_FIRST 是 ( 0U- 0U),所以我的 64 位机器上的 NM_HOVER 值为 4294967283)。我知道我在这里遗漏了一些东西。有人可以在这里点亮一些灯吗?如何获取富编辑控件的鼠标单击事件?