2016-05-27 15 views
0

Windowsフォームを使用してペイントイベントを処理するための基礎を学ぶチュートリアルに従っています。C# - WInForms - 再描画イベントで古いグラフィックスを破棄します

これまでのところ、プログラムの種類は動作していますが、グラフィックスの更新は、以前に描かれた行を削除することではありません(グラフィックスは削除されません)。

元のチュートリアルではRefreshを使用していましたが、動作していないようで、Invalidate + Updateに置き換えました。

グラフィックスコントロールをthis.CreateGraphics()に設定しても機能しないため、panel2.CreateGraphics()に切り替えました(結果もe.Graphicsも試しました)。

namespace GraphicsTutorialV1 
{ 
    public partial class Form1 : Form 
    { 
     Pen myPen = new Pen(Color.Black); 
     Graphics g = null; 

     static int start_x, start_y; 
     static int end_x, end_y; 

     static int my_angle = 0; 
     static int my_length = 0; 
     static int my_increment = 0; 
     static int num_lines = 0; 

     public Form1() 
     { 
      InitializeComponent(); 

      Int32.TryParse(textBox1.Text, out num_lines); 
      Int32.TryParse(textBox2.Text, out my_angle); 
      Int32.TryParse(textBox3.Text, out my_length); 
      Int32.TryParse(textBox4.Text, out my_increment); 

      start_x = (panel2.Width/2); 
      start_y = (panel2.Height/2); 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      myPen.Width = 1; 
      g = panel2.CreateGraphics(); 
      //g = e.Graphics; 

      for(int i = 0; i < num_lines; i++) 
      { 
       drawLine(); 
      } 
     } 

     private void drawLine() 
     { 
      int temp; 
      Int32.TryParse(textBox2.Text, out temp); 
      my_angle = my_angle + temp; 
      Int32.TryParse(textBox4.Text, out temp); 
      my_length = my_length + temp; 

      end_x = (int)(start_x + Math.Cos(my_angle * Math.PI/180) * my_length); 
      end_y = (int)(start_y + Math.Sin(my_angle * Math.PI/180) * my_length); 

      Point[] points = 
      { 
       new Point(start_x, start_y), 
       new Point(end_x, end_y) 
      }; 

      start_x = end_x; 
      start_y = end_y; 

      g.DrawLines(myPen, points); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Int32.TryParse(textBox1.Text, out num_lines); 
      Int32.TryParse(textBox2.Text, out my_angle); 
      Int32.TryParse(textBox3.Text, out my_length); 
      Int32.TryParse(textBox4.Text, out my_increment); 

      this.Invalidate(); 
      this.Update(); 
     } 
    } 
} 
+4

グラフィックオブジェクトは保存しないでください。 paintイベントで提供された 'e.Graphics'を使用してください。パネルにペイントさせる場合は、パネルのペイントイベントを使用する必要があります。 – LarsTech

+8

CreateGraphics()を使用してペイントすると、すべてのケースの99.9%で間違っています。そのチュートリアルでは、すぐに使用を中止することをお勧めします。代わりにパネルのPaintイベントを使用します。 Invalidate()メソッドを使用して再描画をトリガーします。あなたは今、成功のピットに陥り、パネルのBackColorプロパティは仕事を完了させます。 –

+0

Micrsoftのチュートリアルは、FillEllipseをブラシとして使用するようなものから始まります。 – TaW

答えて

0

私のコードの問題は、描画命令がフォームのペイントイベントに含まれていることでした。パネルのペイントイベントで図面を設定し、グラフィックを標準的なペイントイベントに設定することで、すべてが機能しました。また、Refreshが機能し始めました。

関連する問題