如何更改winforms网格中矩形的背景颜色?

问题描述:

我正在使用以下代码构建图。我需要能够通过点击鼠标来改变任何给定矩形的颜色。到目前为止,我无法找到一种方法来实现这一点。如何更改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)'对你的矩形进行简单的命中测试。 –

我找到了一种方法来实现这一点。这里是我现在使用的代码。我仍然必须建立颜色选择工具,但我认为这将是一个简单的部分。 您的所有建议都帮助我找到了解决方案。我感谢你们。

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”工作。你的回答确实指向了“包含”的方向,而这正是使所有这些成为可能的原因。谢谢。 –

如果需要用颜色填充矩形,请尝试FillRectangle方法。

如果您需要更改只是边框的颜色,你需要通过调用下面的代码再次用不同的颜色重新描绘它:

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

在最初的绘制中,我需要矩形填充为默认颜色。之后,我需要在应用程序的其他地方选择一种颜色,然后我需要点击每个矩形以填充该新颜色...再次选择一种新颜色,单击更多不同的矩形,如此等等。我不需要在任何时候改变边框的颜色。谢谢。 –

+0

_g = pnlDesign.CreateGraphics(); _不要使用control.CreateGraphics(),除非你真的想要结果是非持久的! – TaW

+0

谢谢,TaW。如果有更好的方法来构建这个网格,我愿意提供建议......非常感谢。 –

这并不是解决选择颜色的问题,但您可能能够通过添加此启动:

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()); 
    }  
} 

编辑:

已更新为使用礼的建议。