2012-10-21 97 views
1

我想在PictureBox中繪製一條線的旋轉動畫。我用pictureBox1.CreateGraphics()來畫線,但是我聽說這種方法不適用於PictureBox。另外,我在PictureBox窗口上遇到沉重的閃爍,有什麼建議?下面是一個代碼段:繪製pictureBox中的旋轉線

private void OnTimedEvent(object source, PaintEventArgs e) 
    { 
     try 
     { 
      if (comport.BytesToRead > 0) 
      { 
       X = comport.ReadByte(); 
       Y = comport.ReadByte(); 
       Z = comport.ReadByte(); 
      } 

      Graphics g = pictureBox1.CreateGraphics(); 
      Pen red = new Pen(Color.Red, 2); 
      g.TranslateTransform(100, 80 - X); 
      g.RotateTransform(120); 
      g.DrawLine(red, new Point(100, 0 + X), new Point(100, 80 - X)); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     try 
     { 
      timer1.Interval = 1; 
      pictureBox1.Invalidate(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

回答

1

嘗試移動你的繪製代碼在pictureBox1.Paint事件處理程序並調用pictureBox1.Invalidate whenewer你需要重新繪製你的pictureBox1。這是如何繪製的真實方式。此刻,你正在閃爍,因爲你每秒都會重繪pictureBox1,但是在那一刻你沒有繪製基元。

 byte X; 
     byte Y; 
     byte Z; 
     private void OnTimedEvent(object source, PaintEventArgs e) 
     { 
      try 
      { 
       if (comport.BytesToRead > 0) 
       { 
        X = comport.ReadByte(); 
        Y = comport.ReadByte(); 
        Z = comport.ReadByte(); 
       } 
       pictureBox1.Invalidate(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      try 
      { 
       timer1.Interval = 1; 
       pictureBox1.Invalidate(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      Pen red = new Pen(Color.Red, 2); 
      g.TranslateTransform(100, 80 - X); 
      g.RotateTransform(120); 
      g.DrawLine(red, new Point(100, 0 + X), new Point(100, 80 - X)); 
     } 
+0

還有一件事,如果我想在不清除現有行的情況下在pictureBox中繪製一條線,我該怎麼辦? – HacLe

+0

有兩種可能的方法。如果要繪製有限數量的行,可以將每個新的X值存儲到列表或數組中(我更喜歡列表是因爲它們可以變得更容易),並且當有足夠的值時(比如說10-20),應該添加新的值並刪除最老的。然後在每個Paint事件中,您應該遍歷這些值並繪製線條。另一種方法可以在每個新行的位圖上繪製而不清除舊行,但最終位圖會被行重載並且圖片無意義。如果你想要更多的澄清我可用。 –