代码:
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--;
}
}
答案 0 :(得分:1)
你不会问一个问题,但你的代码不言自明。
请注意,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
与Location
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
。