1

私は現在、特定のコントロール(この場合はtoolStrip)上でマウスをクリックして移動するときに、フォームを移動するために前述のコードを使用しています。

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) //Wenn die linke Maustaste gedrückt wurde,
            FormMouseDownLocation = e.Location; //wird die Position der Maus gespeichert
    }

    private void toolStrip1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) //Wird die Linke taste gedrückt und bewegt,
        {
            this.Left += e.X - FormMouseDownLocation.X; //so verschiebt sich das Fenster bei jeder Bewegung um die Positionänderung der Maus (hier die X Pos)

            this.Top += e.Y - FormMouseDownLocation.Y; //so verschiebt sich das Fenster bei jeder Bewegung um die Positionänderung der Maus (hier die Y Pos)
        }
    }

今、私は問題を抱えています。カーソルはフォームよりも速く移動するため、カーソルがtoolStripを離れると、フォームの移動が停止することがよくあります。これは、このコードをメインフォーム以外のコントロールと組み合わせて使用​​した場合にのみ発生します。

この動作に対する解決策はありますか、または別のコントロールをクリックしたときにフォームの位置を変更するためのより良い方法はありますか?

前もって感謝します

追加情報:私はwinformsを使用しています、FormBorderStyle:なし

4

2 に答える 2

3

これは一般的な問題です。カーソルがツールストリップウィンドウの外に移動したときにMouseMoveイベントが引き続き発生するように、マウスをキャプチャする必要があります。どのウィンドウでも問題が発生しますが、ツールストリップは細くなる傾向があるため、ツールストリップで発生する可能性が高くなります。修理:

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left) {
        FormMouseDownLocation = e.Location;
        toolStrip1.Capture = true;
    }
}

private void toolStrip1_MouseUp(object sender, MouseEventArgs e)
{
    toolStrip1.Capture = false;
}

より良い変数名を選んでください。「FormMouseDownLocation」は非常に不正確であり、場所はフォームとはまったく関係ありません。

于 2013-03-27T11:17:38.527 に答える
0

これを参照することができます。パネルや、たとえばヘッダーとして使用できる任意のオブジェクトを使用できます。リンクを確認してください。彼らが使用する部分ではありませんWndProc

于 2013-03-27T10:12:36.833 に答える