2016-08-19 10 views
0

次のコードを使用してグラフを作成しています。任意の四角形の色をマウスでクリックして変更する必要があります。私はこれまで、これを達成する方法を見つけることができません。winformsグリッドの四角形の背景色を変更するにはどうすればよいですか?

アイデアをいただければ幸いです。

int number; 
    public List<Rectangle> listRec = new List<Rectangle>(); 
    Graphics g; 

    public CrochetPtrnDesign() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      number = int.Parse(textBox1.Text); 
      Rectangle rect = new Rectangle(); 
      listRec.Clear(); 
      rect.Size = new Size((pnlDesign.Width - 1)/number, (pnlDesign.Height - 1)/number); 
      for (int x = 0; x < number; x++) 
      { 
       rect.X = x * rect.Width; 
       for (int y = 0; y < number; y++) 
       { 
        rect.Y = y * rect.Height; 
        listRec.Add(rect); 
       } 
      } 
     } 
     catch 
     { 
      MessageBox.Show("Please enter a number..."); 
     } 
     foreach (Rectangle rec in listRec) 
     { 
      g = pnlDesign.CreateGraphics(); 
      Pen p = new Pen(Color.Black); 
      g.DrawRectangle(p, rec); 
     } 
    } 
+1

_g = pnlDesign.CreateGraphics(); _ control.CreateGraphicsを()あなたが実際に非永続する結果とする場合を除き、使用しないでください!クラスレベルで保存するデータを使用して、Paintイベントですべての描画を実行する必要があります。これらのデータが変更されると、pnlDesign.Invalidateを実行してPaintイベントをトリガし、スクラッチagianから__everything__を描画させます。 – TaW

+0

1)なぜ矩形リストをいつも再作成しますか?それは、クリックするたびにサイズが変更されるたびに作成する必要があります。 2)四角形をクリックする前にどの色を使用していますか? – TaW

+1

コードは何をすべきか?クリックで矩形の色を変更したい場合、 'Rectangle.Contains(Point)'を使って矩形に対して簡単なヒットテストが必要です。 –

答えて

-1

これを実現する方法が見つかりました。ここで私が今使っているコードを示します。私はまだ色選択ツールを構築する必要がありますが、それは簡単な部分になると思います。 あなたの提案は私を解決に導いてくれました。私はあなたすべてに感謝します。

private void pnlDesign_MouseClick(object sender, MouseEventArgs e) 
{ 
    Point point = pnlDesign.PointToClient(Cursor.Position); 
    SolidBrush blueBrush = new SolidBrush(Color.Blue); 

    int listCount = 0; 
    for (listCount = 0; listCount < number * number; listCount++) 
    { 
     if (listRec[listCount].Contains(point)) 
     { 
      g.FillRectangle(blueBrush, listRec[listCount]); 
     } 
    } 
} 
+0

これは私の答えよりもどのように優れていますか? –

+0

"listRec.Where"をどのように動作させるかを決めることは決してできませんでした。あなたの答えは、すべてを可能にする「包み込み」の方向に私を指摘しました。ありがとうございました。 –

-1

あなたは色で四角形を埋めるために必要がある場合FillRectangleの方法を試してみてください。

あなただけの境界線の色を変更する必要がある場合は、別の色で再び次のコードを呼び出すことによって、それを再描画する必要があります。これは、色を選択する問題に対処しない

g = pnlDesign.CreateGraphics(); 
Pen p = new Pen(Color.Black); 
g.DrawRectangle(p, rec); 
+0

最初の描画では、長方形の塗りつぶしをデフォルトの色にする必要があります。その後、アプリケーションの別の場所で色を選択する必要があります。次に、新しい色で塗りつぶすためにクリックするすべての矩形が必要です。新しい色をもう一度選択し、より多くの長方形をクリックします。私はいつでも境界線の色を変更する必要はありません。ありがとうございました。 –

+0

_g = pnlDesign.CreateGraphics();実際に非永続的な結果を実際に出さない限り、決してcontrol.CreateGraphics()を使用しないでください! – TaW

+0

ありがとう、TaW。このグリッドを構築するより良い方法があれば、私は提案に開放されています...非常に感謝しています。 –

0

private void pnlDesign_MouseClick(object sender, MouseEventArgs e) 
{ 
    using (Brush brush = new SolidBrush(Color.Red)) 
    { 
     g.FillRectangle(brush, listRec.Where(r => r.Contains(new Point { X = e.X, Y = e.Y })).First()); 
    }  
} 

EDIT:

はレザの勧告を使用するために更新されていますが、これを追加することによって開始することができるかもしれません。

関連する問題