2011-06-08 85 views
2

我正在开发Windows C#,VS 2008应用程序。我有一个MDI容器窗体,在点击按钮期间,我在运行时添加一个新窗体。当创建子窗体时,我会在运行时为其添加面板控件和图片框控件。即使鼠标没有移动,Picturebox mousemove事件也会被触发

我添加鼠标事件处理程序,用于鼠标向上,鼠标向下和鼠标移动的图片框。如预期的那样鼠标上下滑动,但鼠标移动事件在鼠标悬停在画框上而不移动时持续发射。我知道事件正在被解雇,因为在鼠标移动事件中,我保留一个计数器变量,并在每次调用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(); 
+0

事件处理程序代码将很有用。 – alexD 2011-06-08 06:34:23

+1

在我的事件处理程序中我只有在每次调用ImageMouseMove函数时将计数更新到标签的时刻才有以下代码。 'count ++; lblCounter.Text = count.ToString();' – 2011-06-08 06:55:11

+0

现在有同样的问题,不知道如何解决它。 – Kosmos 2013-12-17 18:37:37

回答

0

鼠标在面板移动的画面,当它被同居我有类似的问题。我用Control.MousePosition而不是MouseEventArgs.Location。发生这种情况是因为picturebox MouseMove事件触发,即使它自己的鼠标不移动,但它在PictureBox上。

0

有多种方法可以规避这种情况。但这可能是最简单的解决方案。脏,但它的作品。

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

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

相关问题