我在父窗口中有一个子窗口。 当我拖动并移动子窗口时,我希望子窗口不会离开父边框。
这是我在child的回调中的当前工作代码:
case WM_MOVE:
RECT rect = getLocalCoordinates(hWnd);
RECT rectFather;
GetWindowRect(hWndFather, &rectFather);
if (rect.left < 0)
rect.left = 0;
if (rect.top < 0)
rect.top = 0;
if (rect.bottom > rectFather.bottom - rectFather.top - 60)
rect.top = rectFather.bottom - rectFather.top - 341;
if (rect.right > rectFather.right - rectFather.left - 35)
rect.left = rectFather.right - rectFather.left - 110;
SetWindowPos(hWnd, NULL,rect.left, rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
break;
我唯一想念的是当我的子窗口拖过父边框时,子窗口会一直闪烁。
这是因为子窗口首先移出边界,而WM_MOVE
消息触发了SetWindowPos
。
我的问题是:如何通过覆盖鼠标拖动事件来阻止这种情况?
答案 0 :(得分:3)
感谢RbMm,我需要WM_WINDOWPOSCHANGING
消息。
新的工作代码:
case WM_WINDOWPOSCHANGING:
WINDOWPOS *pos = (WINDOWPOS *)lParam;
RECT rectFather;
GetWindowRect(hWndFather, &rectFather);
if (pos->x < 0)
pos->x = 0;
if (pos->y < 0)
pos->y = 0;
if (pos->y > rectFather.bottom - rectFather.top - 341)
pos->y = rectFather.bottom - rectFather.top - 341;
if (pos->x > rectFather.right - rectFather.left - 110)
pos->x = rectFather.right - rectFather.left - 110;
break;
答案 1 :(得分:3)
在处理WM_WINDOWPOSCHANGING时,可以限制窗口移动,一旦将鼠标移动到允许区域之外,它就会破坏鼠标光标和拖动窗口之间的视觉连接,这会产生令人不快的效果。
该问题的另一个解决方案是通过调用ClipCursor来限制光标移动,传入适当大小的边界矩形。这可确保光标始终位于相对于拖动窗口的相同位置。