我目前正在处理的项目中有两个RichEdit控件彼此靠近:让我们说RichEdit1在左边而RichEdit2在右边。
我想在项目中启用的用户场景是:
我想看到RichEdit1第3个字符结束并且RichEdit2开始第6个字符被选中。
目前我注意到,一旦鼠标LButton关闭RichEdit1,在我将鼠标移动到RichEdit2后,RichEdit2在我发布鼠标之前无法接收鼠标事件。
任何建议将不胜感激。谢谢!
答案 0 :(得分:1)
当在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
样式,以便您可以同时在两个控件中查看选择。