我目前正在开发一个项目,该项目将具有两个彼此相邻的RichEdit控件:假设RichEdit1在左侧,RichEdit2在右侧。

我要在项目中启用的用户方案是:


用户鼠标LButton向下在RichEdit1中的某个位置,例如在第3个字符之前,总共7个字符。
用户将鼠标拖到RichEdit2,例如在第6个字符之后,总共11个字符。
用户鼠标LButton向上。


我想同时选择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样式,以便您可以同时看到两个控件中的选择。

关于c++ - 如何在两个RichEdit控件中连续选择内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31663877/

10-13 09:22