如何在两个richit控件中连续选择内容



我目前正在做一个项目,它将有两个richeit控件一个靠近另一个:让我们说RichEdit1在左边,RichEdit2在右边。

我想在项目中启用的用户场景是:

  1. 用户鼠标LButton在RichEdit1中的某处,例如在第3个字符之前,总共7个字符。
  2. 用户将鼠标拖动到RichEdit2,例如在第6个字符之后,总共11个字符。
  3. 用户鼠标左键向上。

我想看到RichEdit1第3个字符结束和RichEdit2开始到第6个字符被选中。

目前我注意到,一旦鼠标LButton在RichEdit1上,当我将鼠标移动到RichEdit2上时,在我释放鼠标之前,RichEdit2无法接收鼠标事件。

任何建议都将不胜感激。谢谢你!

当在RichEdit1上按下鼠标按钮时,它捕获鼠标,因此随后的鼠标消息被发送到RichEdit1,直到鼠标按钮被释放。这就是为什么当拖动到RichEdit2上时,RichEdit2不接收任何鼠标事件。

您必须处理RichEdit1中的鼠标移动消息,并检查它们的坐标是否在RichEdit1的客户端区域之外。如果是,将它们转换为相对于RichEdit2的客户端区域的坐标,然后根据需要将EM_SETSEL/EM_EXSETSEL消息发送给RichEdit2。例如:

int RichEdit2StartIndex = -1;
...
// in RichEdit1's message handler...
case WM_MOUSEMOVE:
{
    if ((wParam & MK_LBUTTON) == 0)
        break;
    int xPos = GET_X_LPARAM(lParam); 
    int yPos = GET_Y_LPARAM(lParam); 
    RECT r;
    GetClientRect(hwndRichEdit1, &r);
    if (xPos < (r.right - r.left))
    {
        if (RichEdit2StartIndex != -1)
        {
            SendMessage(hwndRichEdit2, EM_SETSEL, -1, 0);
            RichEdit2StartIndex = -1;
        }
    }
    else
    {
        POINT pt;
        pt.x = xPos; 
        pt.y = yPos; 
        MapWindowPoints(hwndRichEdit1, hwndRichEdit2, &pt, 1);
        POINTL pl;
        Pl.x := pt.x;
        Pl.y := pt.y;
        int idx = SendMessage(hwndRichEdit2, EM_CHARFROMPOS, 0, (LPARAM)&Pl);
        if (idx != -1)
        {
            if (RichEdit2StartIndex == -1)
                RichEdit2StartIndex = idx;
            SendMessage(hwndRichEdit2, EM_SETSEL, RichEdit2StartIndex, idx);
        }
    }
    break;
}

当从RichEdit2拖动到RichEdit1时,反之亦然。

并且确保两个RichEdit控件都应用了ES_NOHIDESEL样式,这样你就可以同时在两个控件中看到选区

最新更新