C# 为什么mouseeventarg在等式中使用时不起作用
Windows窗体应用程序: 这让我困惑了好几个小时。我试图做的是当我按住标签时,它会移动表单C# 为什么mouseeventarg在等式中使用时不起作用,c#,winforms,C#,Winforms,Windows窗体应用程序: 这让我困惑了好几个小时。我试图做的是当我按住标签时,它会移动表单 private void label1_MouseUp(object sender, MouseEventArgs e) { KeepMoving = false; } private void label1_MouseDown(object sender, MouseEventArgs e) { KeepMoving = tr
private void label1_MouseUp(object sender, MouseEventArgs e)
{
KeepMoving = false;
}
private void label1_MouseDown(object sender, MouseEventArgs e)
{
KeepMoving = true;
}
private void label1_MouseMove(object sender, MouseEventArgs e)
{
if (KeepMoving == true)
this.Location = new Point(MousePosition.X - (e.X + SystemInformation.FrameBorderSize.Width + label1.Left), MousePosition.Y - (e.Y + SystemInformation.CaptionHeight + label1.Top));
}
这就是我正在使用的(当然是公共bool KeepMoving)
如果我移除e.X和e.Y,一切都正常,但是它是相对于标签左上角的位置,但是我想要标签上的位置
当我使用messagebox来显示标签上e.X和e.Y的坐标时,数字是正确的,显示了我在标签上单击的位置。当我使用上面代码中的点时,无论我在标签上单击什么位置,数字都不会改变,当我尝试移动它时,它会上升到30k+范围
为什么MouseEventArgs在我的等式中不起作用?很抱歉,如果我描述得不好,我已经尽力了。跟踪标签左上角的初始偏移量,并相应地调整表单的位置
public bool KeepMoving = false;
private Point offset;
private void label1_MouseDown(object sender, MouseEventArgs e)
{
KeepMoving = true;
offset = new Point(e.X, e.Y);
}
private void label1_MouseUp(object sender, MouseEventArgs e)
{
KeepMoving = false;
}
private void label1_MouseMove(object sender, MouseEventArgs e)
{
if (KeepMoving)
{
Left += e.X - offset.X;
Top += e.Y - offset.Y;
}
}
我理解它背后的逻辑,但我可以问一下它与上面的有什么不同吗?当它相应地更改和更新时,为什么不获取当前参数?但是,谢谢,它确实可以按我所希望的方式工作。当标签与鼠标光标的相对位置发生变化时,MouseMove事件将再次引发。这是一个微妙的无限循环。通过使用恒定的相对位置(
offset
,在本例中),当e
和offset
相等时,“循环”将终止(导致Left+=0;Top+=0
不会引发MouseMove
事件)。移动标签会更改标签相对于鼠标光标的相对位置。你需要记录你从哪里开始的。