当鼠标没有移动时,Picturebox鼠标移动事件仍然会触发。

3
我正在开发一个Windows C#,VS 2008应用程序。我有一个MDI容器表单,在单击按钮时在其中添加一个新表单。当创建子表单时,我在运行时向其添加面板控件和图片框控件。
我为图片框添加鼠标事件处理程序,包括鼠标按下、鼠标抬起和鼠标移动事件。鼠标按下和抬起按预期工作,但鼠标移动事件会在鼠标停留在图片框上且不移动时持续触发。我知道事件被触发了,因为在鼠标移动事件中,我保留了一个计数器变量,并在每次调用mousemove事件时将其值递增并更新到标签中。
为什么会这样?下面是我使用的代码。
谢谢!
            Form frm = new Form();
            frm.Deactivate += new EventHandler(MDIChildDeactivate);
            PictureBox pi = new PictureBox();
            pi.Dock = DockStyle.Fill;

            pi.MouseUp += new MouseEventHandler(ImageMouseUp);
            pi.MouseDown += new MouseEventHandler(ImageMouseDown);                
            pi.MouseMove += new MouseEventHandler(ImageMouseMove);
            pi.Paint += new PaintEventHandler(CanvasPaint);
            pi.KeyDown += new KeyEventHandler(ImageKeyDown);
            pi.KeyPress += new KeyPressEventHandler(ImageKeyPress);

            /////////////////////////////////////////////////////////
            pi.PreviewKeyDown += new PreviewKeyDownEventHandler(pi_PreviewKeyDown);
            /////////////////////////////////////////////////////////

            if (!IsTabbedMdi)
                frm.ClientSize = size;
            frm.AutoScroll = true;
            pi.Name = ProjectFileName;

            Panel pnl = new Panel();
            pnl.Dock = DockStyle.None;
            pnl.Size = WarpArt.Properties.Resources.GreyCheckerBoard.Size;
            pi.Image = WarpArt.Properties.Resources.GreyCheckerBoard;
            pnl.AutoScroll = true;
            pnl.HorizontalScroll.Visible = true;
            pnl.VerticalScroll.Visible = true;
            pnl.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            pnl.Name = ProjectFileName;

            pnl.Controls.Add(pi);
            frm.Controls.Add(pnl);
            frm.MdiParent = this;
            frm.Show();

有助于了解事件处理程序代码。 - alexD
1
在我的事件处理程序中,目前只有以下代码,每次调用ImageMouseMove函数时都会将计数更新到标签上。count++; lblCounter.Text = count.ToString(); - over.drive
现在也遇到了同样的问题,不知道该怎么解决。 - Kosmo零
这是答案:http://stackoverflow.com/questions/8418738/why-is-mousemove-event-firing-when-left-mouse-is-clicked-only-for-mousedown-even - Kosmo零
2个回答

1

在面板中用鼠标移动图片时,我遇到了类似的问题,它会抖动。我使用了 Control.MousePosition 而不是 MouseEventArgs.Location。这是因为即使鼠标本身不移动,但当它在PictureBox上时,PictureBox的MouseMove事件仍然会触发。


0

有多种方法可以规避这个问题。然而,这可能是最简单的解决方案。虽然不太优雅,但它确实有效。

private void MouseMove(object sender, MouseEventArgs e)
        {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                 //dosomething
                }
        }

解释一下:当调用MouseMove事件时,除非按下(在这种情况下)左键鼠标,否则不会执行任何操作。只有在这种情况下,if语句中的代码才会被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接