如何使这个(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--;
}
}
您不会问任何问题,但您的代码不言自明。。
注意,Cursor.Position
在屏幕坐标中,pbMove.xxx
在其Parent
的坐标中,可能是形式。看看PointToScreen
和PointToClient
!
更换
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()
。