2011-06-08 86 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語句中的代碼纔會被執行。

相關問題