2016-10-26 26 views
2

親ウィンドウに子ウィンドウがあります。 子ウィンドウをドラッグして移動すると、子ウィンドウが親境界線から外れないようにします。ここでwin32ウィンドウのドラッグ/移動の動作を変更する

は子供のコールバックで私の現在の作業コードです:

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をトリガーするためです。

私の質問は、どうすればこれを防ぐことができますか、マウスのドラッグイベントをオーバーライドすることができますか?

+1

WM_WINDOWPOSCHANGINGハンドルが必要です – RbMm

答えて

2

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; 
2

窓の動きを制限することが可能であるWM_WINDOWPOSCHANGINGを扱う、それはマウスカーソルとドラッグウィンドウ間の視覚的な接続を切断するために不快な効果がありますが、あなたは外にマウスを移動したら、許可された領域。

問題のもう1つの解決策は、ClipCursorを呼び出して、適切なサイズの境界矩形を渡して、カーソルの移動を制限することです。これにより、カーソルが常にドラッグされたウィンドウと同じ位置にくるようになります。

関連する問題