修改win32窗口拖动/移动行为

时间:2016-10-26 09:10:49

标签: c++ windows winapi

我在父窗口中有一个子窗口。 当我拖动并移动子窗口时,我希望子窗口不会离开父边框。

这是我在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

我的问题是:如何通过覆盖鼠标拖动事件来阻止这种情况?

2 个答案:

答案 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来限制光标移动,传入适当大小的边界矩形。这可确保光标始终位于相对于拖动窗口的相同位置。