2016-04-28 13 views
1

私が取り組んでいるこの小さなプログラムの目的は、radiobutton1がチェックされている間に赤い円を描き、radiobutton2がチェックされている間は黒い円を描くことです。2色の円を一緒に保つ方法

以下は私のコードです。このコードの問題は、radiobutton1がチェックされているときに赤い円を描いていますが、radiobutton2をクリックするとすべての赤い円が黒くなります。次にラジオボタン1をもう一度チェックすると、すべての点が再び赤色に変わります。

どのようにしてパネルに両方の色の円を維持できますか?

List<Point> points = new List<Point>(); 

Graphics g; 
private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    points.Add(e.Location); 
    panel1.Invalidate(); 
} 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    int count = 0; 
    if (radioButton1.Checked) 
    { 
     g = e.Graphics; 
     while (count < points.Count()) 
     { 
      g.FillEllipse(Brushes.Red, points[count].X, points[count].Y, 10, 10); 
      count++; 
     } 
    } 
    else if (radioButton2.Checked) 
    { 
     g = e.Graphics; 
     while (count < points.Count()) 
     { 
      g.FillEllipse(Brushes.Black, points[count].X, points[count].Y, 10, 10); 
      count++; 
     } 
    } 
} 

答えて

2

私があなたの意図を正しく理解している場合は、各色ごとに1点ずつ2点のリストを保持する必要があります。次に、どこかをクリックすると、クリックしたポイントを適切なリスト(赤または黒)に入れます。次に、Paintイベントハンドラで、条件付きコードを2つのループに置き換えます.1つは各ポイントのリスト(赤のリストから赤のリストからポイントを、黒のリストからは黒でポイントを引く)です。

コード:

List<Point> redPoints = new List<Point>(); 
List<Point> blackPoints = new List<Point>(); 

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (radioButton1.Checked) 
     redPoints.Add(e.Location); 
    else 
     blackPoints.Add(e.Location); 
    panel1.Invalidate(); 
} 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    int count = 0; 
    Graphics g = e.Graphics; 
    foreach (Point p in redPoints) 
    { 
     g.FillEllipse(Brushes.Red, p.X, p.Y, 10, 10); 
    } 
    foreach (Point p in blackPoints) 
    { 
     g.FillEllipse(Brushes.Black, p.X, p.Y, 10, 10); 
    } 
} 

注:サークルが互いに重複し、(最初のクリックした円は最初の描画)積層秩序の維持を心配している場合、それはすべての円を保つBlorgbeardのソリューションが優れている@ので、同じリストに表示され、元のレイヤリングが維持されます。受け入れられた答えを自由に切り替えてください。

+0

ありがとうございました。 – perryfanfan

+0

こんにちは、@ adv12、私は、赤い円を囲む背景色を持つことができますか?バックグラウンドもサークルなので、赤い円はバックグラウンドサークルの内側にありますが、これにどのようにアプローチすればよいですか? – perryfanfan

+0

もちろん、2つの塗りつぶされた円を描くだけです。最初は黒いもの、次に小さな赤いものを描きます。バックグラウンドサークルをどれくらいの幅のピクセルで広げるかを決定し、それに応じてフォアグラウンドサークルをオフセット/サイズ調整する必要があります。 – adv12

3

Windowsフォームでグラフィックスが動作する方法は、ペイント方法によってパネル全体が再描画されます。

paintメソッドが実行されるたびに、すべてのポイントが既に描画されています。これは正しいです。

しかし、どの点がどの色であるはずなのかを覚えておく方法がないので、ペイントしたときに続ける必要があるのはラジオボタンの現在の値です。サークルを追加するときは、現在の色を記録する方法が必要です。これを行うための

一つの方法は、円の位置色格納サークルのクラスを定義することであろう。

class Circle 
{ 
    public Point Location { get; set; } 
    public Brush Fill { get; set; } 
} 
そして

代わりにpointsList<Point>であるが、それはList<Circle>することができ、そして

var circle = new Circle() 
{ 
    Location = e.Location, 
    Fill = radioButton1.Checked ? Brushes.Red : Brushes.Black 
}; 
points.Add(circle); 

そして、あなたは絵を行うときに、あなたがチェックすることができEA:あなたはマウスクリックを見たとき、あなたは新しいCircle代わりPointのを追加することができますあなたがそれらを描くようchの円の色 - あなたがしなければならないすべてはこれです:あなたはメンバーのレベルGraphics gを必要としない

foreach (var circle in points) 
{ 
    e.Graphics.FillEllipse(circle.Fill, circle.Location.X, circle.Location.Y, 10, 10); 
} 

注 - とPaint方法が終了した後に、それはGraphicsオブジェクトを保持するために悪い考えです。後で有効であるとは限りません。常にe.Graphicsを使用してください。

whileループをより簡単にforeachに置き換えました。

関連する問題