为什么即使鼠标没有移动,PictureBox的MouseMove事件似乎也会连续触发? 我已经尝试了以下代码来证明它(通过简单地创建一个带有PictureBox和Label的新表单)。
private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}
答案 0 :(得分:4)
某些涉及窗体形式的方法会导致窗体的某种程度的内部刷新,这(根据我的估计)会导致窗体“拾取”鼠标位置,从而触发MouseMove事件。一种这样的方法是将工具提示与表单相关联。结果,
int moveCount = 0;
ToolTip toolTip = new ToolTip();
private void form1_MouseMove(object sender, MouseEventArgs e)
{
Trace.WriteLine(moveCount);
moveCount++;
toolTip.SetToolTip(this, "Hello world");
}
即使鼠标未移动,也会连续闪光,而
int moveCount = 0;
private void form1_MouseMove(object sender, MouseEventArgs e)
{
Trace.WriteLine(moveCount);
moveCount++;
}
只有在实际移动鼠标时才会触发。
查看MouseMove事件内部以“深入”方式触摸表单的内容可能有助于揭示循环行为的来源。
答案 1 :(得分:2)
“pictureBox1_MouseMove”只是一个委托功能。因此,对于您的代码,我们只能假设它在设计器中附加到MouseMove,而且只附加了MouseMove。
仔细检查“pictureBox1_MouseMove”的所有引用,同时请记住,即使您不移动鼠标,Windows也会在鼠标单击时触发MouseMove消息。
最糟糕的情况是,您可以将Point e.Location存储在本地成员变量(“oldLocation”)中,并在处理命令之前验证鼠标是否实际移动了:
private Point oldLocation = Point.Empty;
private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
if (e.Location != oldLocation)
{
oldLocation = e.Location;
label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}
}
答案 2 :(得分:1)
首先猜测......无论是地震活动还是谜团 - 我怀疑是傻笑:)。
使用您提供的代码示例我没有得到相同的行为。如果鼠标实际移动,我的标签只会更新。 (并且指针必须在图片框上方才能启动)。
但严重的是......你的桌子上有振动吗?我也可能尝试另外一个鼠标 - 因为里面的电路可能会发送错误的数据。
答案 3 :(得分:0)
观察:如果MouseMove事件处理程序代码沿任一方向修改了控件的大小(通过AutoSize属性显式或隐式),则即使没有实际的鼠标移动,也会重新调用MouseMove事件处理程序。这可能导致恶性循环。如果自动尺寸控件的宽度已更改,但其宽度仍然稳定,则不会重新调用MouseEvent处理程序。