2016-08-19 108 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事件並讓它從頭開始繪製__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()); 
    }  
} 

編輯:

已更新爲使用禮的建議。