如何更改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);
}
}
我找到了一种方法来实现这一点。这里是我现在使用的代码。我仍然必须建立颜色选择工具,但我认为这将是一个简单的部分。 您的所有建议都帮助我找到了解决方案。我感谢你们。
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]);
}
}
}
这比我的回答好吗? –
我从来没有能够弄清楚如何让“listRec.Where”工作。你的回答确实指向了“包含”的方向,而这正是使所有这些成为可能的原因。谢谢。 –
如果需要用颜色填充矩形,请尝试FillRectangle方法。
如果您需要更改只是边框的颜色,你需要通过调用下面的代码再次用不同的颜色重新描绘它:
g = pnlDesign.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawRectangle(p, rec);
在最初的绘制中,我需要矩形填充为默认颜色。之后,我需要在应用程序的其他地方选择一种颜色,然后我需要点击每个矩形以填充该新颜色...再次选择一种新颜色,单击更多不同的矩形,如此等等。我不需要在任何时候改变边框的颜色。谢谢。 –
_g = pnlDesign.CreateGraphics(); _不要使用control.CreateGraphics(),除非你真的想要结果是非持久的! – TaW
谢谢,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());
}
}
编辑:
已更新为使用礼的建议。
_g = pnlDesign.CreateGraphics();从来没有使用control.CreateGraphics(),除非你真的想要导致非持久性!您需要使用您在课程级别存储的数据在Paint事件中完成所有绘图。当这些数据更改通过执行pnlDesign.Invalidate触发Paint事件并让它从头开始绘制__everything__时。 – TaW
1)为什么你总是重新创建矩形列表?它需要在尺寸变大时创建,而不是每次点击。 2)在点击它们之前矩形有什么颜色? – TaW
代码应该做什么?如果你想通过点击来改变矩形的颜色,你需要使用'Rectangle.Contains(Point)'对你的矩形进行简单的命中测试。 –