2012-10-21 9 views
1

PictureBox 안에 선 회전 애니메이션을 그려야합니다. 나는 회선을 그릴 때 pictureBox1.CreateGraphics()을 사용하지만이 방법이 PictureBox에 적합하지 않다고 들었다. 또한 PictureBox 창에 큰 깜박임이 발생합니다. 어떤 제안이 있습니까? pictureBox1.Paint 이벤트 처리기에서 드로잉 코드를 이동하고 당신이 당신의 pictureBox1를 다시 그릴 필요가 whenewer 단지 pictureBox1.Invalidate를 호출하는그림 상자에 회전 선 그리기

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을 다시 그리기 때문에 순간적으로 깜박입니다. 그러나 그 순간에 그리기위한 프리미티브가 없습니다.

 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의 각 새 값을 목록 또는 배열에 저장할 수 있습니다. 목록을 선호하기 때문에 목록을 선호합니다. 목록을 더 많이 만들 수 있기 때문에 목록을 선호합니다. 가장 오래된 값을 제거하십시오. 그런 다음 모든 Paint 이벤트에서 해당 값을 반복하고 선을 그려야합니다. 다른 방법은 비트 맵에서 각 새 행을 지우지 않고 그리는 것일 수 있지만 결국에는 비트 맵에 선이 오버로드되고 그림에 아무런 의미가 없습니다. 좀 더 명확히하고 싶다면 사용할 수 있습니다. –