3

Windowsフォームアプリケーション:

これは何時間も私を困惑させてきました。私がやろうとしているのは、ラベルを押し続けるとフォームが移動することです。

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        KeepMoving = false;
    }

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        KeepMoving = true;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (KeepMoving == true)
            this.Location = new Point(MousePosition.X - (e.X + SystemInformation.FrameBorderSize.Width + label1.Left), MousePosition.Y - (e.Y + SystemInformation.CaptionHeight + label1.Top));

    }

これが私が使用しているものです(もちろん、パブリックブールのKeepMovingを使用します)。

eXとeYを削除すると、すべて正常に機能しますが、ラベルの左上の位置を基準にしていますが、ラベル自体の位置が必要です。

メッセージボックスを使用してラベルのeXとeYの座標を表示すると、番号が正しく表示され、ラベルのどこをクリックしたかがわかります。上記のコードのポイントを使用すると、ラベルのどこをクリックしても番号は変わりません。移動しようとすると、30k以上の範囲になります。

MouseEventArgsが方程式で機能しないのはなぜですか?申し訳ありませんが、説明が不十分な場合は、できる限りのことを試みました。

4

1 に答える 1

2

ラベルの左上隅からの最初のオフセットを追跡し、それに応じてフォームの位置を調整します。

    public bool KeepMoving = false;
    private Point offset;

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        KeepMoving = true;
        offset = new Point(e.X, e.Y);
    }

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        KeepMoving = false;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (KeepMoving)
        {
            Left += e.X - offset.X;
            Top += e.Y - offset.Y;
        }
    }
于 2013-02-01T15:54:06.010 に答える