3

ユーザーがコントロールをクリックしてドラッグしたときに、コントロールをカーソルに追従させようとしています。問題は、1.) コントロールがマウスの位置に移動しないこと、および 2.) コントロールがちらつき、あちこちに飛んでしまうことです。これを行うためにいくつかの異なる方法を試しましたが、これまでのところすべて失敗しています。

私はもう試した:

protected override void OnMouseDown(MouseEventArgs e)
{
     while (e.Button == System.Windows.Forms.MouseButtons.Left)
     {
          this.Location = e.Location;
     }
}

protected override void OnMouseMove(MouseEventArgs e)
{
     while (e.Button == System.Windows.Forms.MouseButtons.Left)
     {
          this.Location = e.Location;
      }
}

しかし、これらはどちらも機能しません。どんな助けでも大歓迎です、そして前もって感謝します!

4

4 に答える 4

10

方法は次のとおりです。

private Point _Offset = Point.Empty;

protected override void MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        _Offset = new Point(e.X, e.Y);
    }
}

protected override void MouseMove(object sender, MouseEventArgs e)
{
    if (_Offset != Point.Empty)
    {
        Point newlocation = this.Location;
        newlocation.X += e.X - _Offset.X;
        newlocation.Y += e.Y - _Offset.Y;
        this.Location = newlocation; 
    }
}

protected override void MouseUp(object sender, MouseEventArgs e)
{
    _Offset = Point.Empty;
}

_Offsetここでは 2 つの目的で使用されます。最初にクリックしたときにマウスがコントロール上にあった場所を追跡することと、マウス ボタンが押されているかどうかを追跡することです (マウス カーソルがクリックされたときにコントロールがドラッグされないようにするため)。上に移動し、ボタンが押されていない)。

このコードの s を s に切り替えたくないのは間違いありません。違いが生じるからです。ifwhile

于 2010-04-24T04:05:47.950 に答える
2

答えには間違いがあります。 .

これらの変更後の私のテストでは、ボタン(または他のコントロール)がうまく動きます。

チグク

于 2013-03-01T16:17:26.160 に答える
1

マウスの位置に応じてオブジェクトを移動するには、これを試してください。以下のコードは、マウスの移動パスと配列リストに保存されている場所を収集して、マウス ポイントが移動しているパスを取得します。arraylist をグローバルに宣言する必要があります。

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ArrayList inList = new ArrayList();
        inList.Add(e.X);
        inList.Add(e.Y);
        list.Add(inList);
    }
}

ユーザーがボタンをクリックすると、コントロールはユーザーが画面内でドラッグしたパスに移動する必要があります

private void button1_Click_2(object sender, EventArgs e)
{
    foreach (ArrayList li in list)
    {
        pic_trans.Visible = true;
        pic_trans.Location = new Point(Convert.ToInt32(li[0]), Convert.ToInt32(li[1]));
        pic_trans.Show();
    }
}
于 2015-03-21T11:17:52.400 に答える