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

时间:2015-06-09 11:00:41

标签: c#

代码:

    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--;
        }
    }

3 个答案:

答案 0 :(得分:1)

你不会问一个问题,但你的代码不言自明。

请注意,Cursor.Position位于屏幕坐标系中,pbMove.xxx位于其Parent的坐标中,可能是表格。查看PointToScreenPointToClient

替换

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

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

等。

另请注意,这将在鼠标后面滞后,因为许多MouseMove事件将覆盖大于1的距离。要使控件“粘住”鼠标,只需设置LocationLocation MouseDown之间的差异Point! (Yopu需要存储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); } } !)

另请注意,您可能应该测试要按下的左按钮。这是一个有效的例子:

script

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

这是我为此编写的绝对最佳代码。它使用的是Microsoft的Reactive Framework(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
                     };

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

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

此代码有效并且非常整洁。

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