1

右クリックドラッグオプションを使用してウィンドウを移動できるようにする必要があります。私はこれを、私が本当に好きではないいくつかの卑劣なコードを介して行いましたが、それは機能します。

現在、WM_NCRBUTTONDOWNメッセージをトラップし、移動モードにあることを示すブール値を設定して、WM_NCRBUTTONUPを受信したときにこの変数をリセットしています。移動モードでは、WMNCMouseMoveをチェックし、フォームを自分で移動しています。これはマウスの速い動きに追いつくのが遅いので、GetCursorPosを使用して同じことを行うようにタイマーも設定しました。

私は最近SwapMouseButton関数を発見しました、そしてこれはまさに私が望むことをします。しかしありますが!条件付きで、ユーザーがウィンドウのCAPTION領域を右クリックした場合にのみ交換する必要があります。

そのため、WM_NCRBUTTONDOWNを受け取ったときにマウスボタンを入れ替えて、WM_NCRBUTTONUPでリセットします。ただし、WM_NCRBUTTONUPがリセットしない限り、これは後続のクリックで機能します。これは、クリックイベントがすでに発生しているため、スワップが遅れているためだと思います。そのため、マウスのスワップを引き起こした右クリックとドラッグではなく、後続の右クリックヒットでは機能します。

誰もがこれを回避する方法を見ることができますか?ボタンを閉じる、最小化する、最大化するために左クリック機能が必要であることを念頭に置いてください。移動するには右クリックします。

助けてください!!!!!

ありがとう、ジョー

4

1 に答える 1

0

マウスを手動で追跡したりボタンを交換したりする代わりに、より簡単な方法があります。それに応じてWM_NCRBUTTONDOWN、特別なメッセージを送信してウィンドウをネイティブに移動モードにするとWM_SYSCOMMAND、ドラッグのすべてのハードワークが処理されます。例えば:

const WPARAM MOUSE_MOVE = SC_MOVE + 2;

case WM_NCRBUTTONDOWN:
{
    POINT pt; 
    GetCursorPos(&pt); 
    SendMessage(Handle, WM_NCRBUTTONUP, 0, MAKELPARAM(pt.x, pt.y));
    SendMessage(Handle, WM_SYSCOMMAND, MOUSE_MOVE, MAKELPARAM(pt.x, pt.y));
    break;
}

詳細については、 Q114593を参照してください。

更新:WM_SYSCOMMAND右クリックで作業することができませんでした(ただし、子コントロールを左クリックするとうまく機能します)。OSは内部処理を行っているため、正しく動作できなくなっていると思います。そこで、マウスの動きをインターセプトしてウィンドウを手動で移動し、SetCapture()代わりに次を使用して、タイマーを使用せずに高速のマウスの動きで正しく動作するようにしました。

bool RightButton_CanMove = false;
bool RightButton_WindowMoved = false;
POINTS LastPoint;

void __fastcall TForm1::WndProc(TMessage &Message)
{
    switch( Message.Msg )
    {
        case WM_NCRBUTTONDOWN:
            LastPoint = MAKEPOINTS(Message.LParam);
            RightButton_CanMove = true;
            RightButton_WindowMoved = false;
            SetCapture(Handle);
            Message.Result = 0;
            return;

        case WM_MOUSEMOVE:
            if( (Message.WParam & MK_RBUTTON) && (RightButton_CanMove) )
            {
                POINT CurPoint;
                GetCursorPos(&CurPoint);

                SetWindowPos(Handle, NULL, Left + (CurPoint.x - LastPoint.x), Top + (CurPoint.y - LastPoint.y), 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
                LastPoint.x = CurPoint.x;
                LastPoint.y = CurPoint.y;

                RightButton_WindowMoved = true;
            }
            break;

        case WM_RBUTTONUP:
            if( RightButton_CanMove )
            {
                RightButton_CanMove = false;
                ReleaseCapture();

                if( RightButton_WindowMoved )
                {
                    RightButton_WindowMoved = false;
                    Message.Result = 0;
                    return;
                }
            }
            break;
    }

    TForm::WndProc(Message);
}

このコードは、右クリック操作と右移動操作を区別しています。ユーザーがマウスを動かさずに右クリックすると、デフォルトのポップアップメニューが通常どおり表示されます。ユーザーがマウスの右ボタンを押したままウィンドウを移動した場合、ユーザーが右ボタンを離したときにデフォルトのポップアップは表示されません。

于 2011-10-07T18:21:58.913 に答える