如何使这个(pbmove)=picturebox跟随我的鼠标

本文关键字:picturebox 跟随 我的 鼠标 何使这 pbmove | 更新日期: 2023-09-27 17:54:28

代码:

    private void pbMove_MouseMove(object sender, MouseEventArgs e)
    {
        if (pbMove.Top > Cursor.Position.Y)
        {
            pbMove.Top--;
        }
        if (pbMove.Top < Cursor.Position.Y)
        {
            pbMove.Top++;
        }
        if (pbMove.Left > Cursor.Position.X)
        {
            pbMove.Left++;
        }
        if (pbMove.Left < Cursor.Position.X)
        {
            pbMove.Left--;
        }
    }

如何使这个(pbmove)=picturebox跟随我的鼠标

您不会问任何问题,但您的代码不言自明。。

注意,Cursor.Position在屏幕坐标中,pbMove.xxx在其Parent的坐标中,可能是形式。看看PointToScreenPointToClient

更换

if (pbMove.Top > Cursor.Position.Y)

带有

if (pbMove.PointToScreen(pbMove.Location).Top > Cursor.Position.Y)

等等。。

还要注意,这将滞后于鼠标,因为许多MouseMove事件将覆盖大于1的距离。要使控件"粘"在你的鼠标上,只需将Location设置为与MouseDown上的Location的差异!(Yopu需要存储Point!(

还需要注意的是,您可能应该测试要按下的左按钮。以下是工作示例:

Point mDown = Point.Empty;
private void pbMove_MouseDown(object sender, MouseEventArgs e)
{  mDown = e.Location;  }
private void pbMove_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Size sz = new Size(mDown.X - e.X, mDown.Y - e.Y);
        pbMove.Location = Point.Subtract(pbMove.Location, sz);
    }
}

我记得在MouseDown事件处理程序中使用了DragMove((方法来做类似的事情。看看这是否有助于

https://msdn.microsoft.com/en-gb/library/system.windows.window.dragmove(VS.85(.aspx

这是我为此编写的最好的代码。它使用微软的反应式框架(NuGet"Rx-WinForms"(。

首先,我们需要知道鼠标何时向下、移动和向上移动。

        var downs =
            Observable
                .FromEventPattern<MouseEventHandler, MouseEventArgs>(
                    h => pbMove.MouseDown += h, h => pbMove.MouseDown -= h)
                .Select(x => x.EventArgs);
        var moves =
            Observable
                .FromEventPattern<MouseEventHandler, MouseEventArgs>(
                    h => pbMove.MouseMove += h, h => pbMove.MouseMove -= h)
                .Select(x => x.EventArgs);
        var ups =
            Observable
                .FromEventPattern<MouseEventHandler, MouseEventArgs>(
                    h => pbMove.MouseUp += h, h => pbMove.MouseUp -= h)
                .Select(x => x.EventArgs);

接下来,我们需要知道鼠标三角洲的位置是什么,从开始向下,当鼠标移动,直到鼠标上升。

        var deltas = from down in downs
                     from move in moves.TakeUntil(ups)
                     select new Point()
                     {
                        X = move.X - down.X,
                        Y = move.Y - down.Y
                     };

最后,我们可以使用这些delta来更新图片框的位置。

        var subscription =
                deltas
                    .Subscribe(d =>
                        pbMove.SetBounds(
                            pbMove.Location.X + d.X,
                            pbMove.Location.Y + d.Y,
                            0, 0, BoundsSpecified.Location));

这段代码很好用,而且非常整洁。

要关闭拖动/移动功能,只需在subscription上调用.Dispose()