即使鼠标不移动,也会触发Picturebox mousemove事件

时间:2011-06-08 06:31:04

标签: c# picturebox mdi mousemove

我正在开发一个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();

2 个答案:

答案 0 :(得分:0)

我在面板上用鼠标移动图片时遇到了类似的问题。我使用Control.MousePosition代替MouseEventArgs.Location。它发生的原因是图片框MouseMove事件触发即使鼠标由它自己不移动,但它在PictureBox上。

答案 1 :(得分:0)

有多种方法可以避免这种情况。然而,这可能是最简单的解决方案。很脏,但它有效。

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

解释这个;当调用MouseMove事件时,除非按下(在本例中)鼠标左键,否则它不会执行任何操作。只有这样才能执行if语句中的代码。