如何在富编辑控件上实现鼠标单击URL

win*_*006 4 c c++ winapi richedit

我在对话框中添加了一个只读的富编辑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);  
Run Code Online (Sandbox Code Playgroud)

在最初启动对话框时启用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;
    }
Run Code Online (Sandbox Code Playgroud)

每当我将鼠标悬停在网址上时,我似乎都会收到WM_NOTIFY事件.然而,当我点击它时,我总是得到相同的事件鼠标悬停在上面.

根据ENLINK的结构,我应该在NMHDR结构中获得更详细的NM事件,但是值plink-> nmhdr.code始终是1803,甚至不是NM_HOVER(其定义的值是(NM_FIRST-13)而NM_FIRST是( 0U-0U),因此我的64位机器上的NM_HOVER值为4294967283).我知道我在这里遗漏了一些东西.有人会在这里点灯吗?如何为富编辑控件获取鼠标单击事件?

A_n*_*to2 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
Run Code Online (Sandbox Code Playgroud)

那么,如果你选择在LBUTTONUP上启动url,你必须检查包含的值enLinkInfo->msg(记得为你的对话调整它)

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

}
Run Code Online (Sandbox Code Playgroud)

此外,你可以拦截WM_MOUSEMOVE:

if(enLinkInfo->msg == WM_MOUSEMOVE) {
                ; // do nothing
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.