在c#中绘制25个矩形(5 * 5)的最佳方法是什么? 我后来需要能够到达特定的矩形并更改其颜色,例如,如果用户输入错误的单词,则将颜色更改为红色。 在这种情况下,创建一个矩形数组会更合适吗?
这是我到目前为止所拥有的
Graphics g = pictureBox1.CreateGraphics();
int x =0;
int y= 0;
int width = 20;
int height = 20;
for (int i = 0; i < 25; i++)
{
if (i <= 4)
{
g.FillRectangle(Brushes.Blue, x, y, width, height);
x += 50;
}
else if (i > 4)
{
y = 50;
g.FillRectangle(Brushes.Blue, x, y, width, height);
x += 50;
}
}
答案 0 :(得分:1)
这应该让你开始,而不是完整的代码。您需要添加PictureBox控件并使用默认名称(picurebox1)。编辑:也需要添加一个按钮:)
public partial class Form1 : Form
{
public List<Rectangle> listRec = new List<Rectangle>();
Graphics g;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Rectangle rect = new Rectangle();
rect.Size = new Size(100,20);
for (int x = 0; x < 5; x++)
{
rect.X = x * rect.Width;
for (int y = 0; y < 5; y++)
{
rect.Y = y * rect.Height;
listRec.Add(rect);
}
}
foreach (Rectangle rec in listRec)
{
g = pictureBox1.CreateGraphics();
Pen p = new Pen(Color.Blue);
g.DrawRectangle(p, rec);
}
}
public void ChangeColor(Rectangle target, Color targetColor)
{
Pen p = new Pen(targetColor);
g.DrawRectangle(p, target.X, target.Y, target.Width, target.Height);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.D0: ChangeColor(listRec[0], Color.Red);
break;
case Keys.D1: ChangeColor(listRec[1], Color.Red);
break;
//..more code to handle all keys..
}
}
}
答案 1 :(得分:0)
如果您不关心性能或外观,那么最简单的方法是在Form_Load事件中创建一个面板列表作为其中一个注释。
List<List<Panel>> panelGrid = new List<List<Panel>>();
for (var i = 0; i < 5; i++)
{
var panelRow = new List<Panel>();
for (var j = 0; j < 5; j++)
{
panelRow.Add(new Panel());
// add positioning logic here
}
panelGrid.Add(panelRow);
}
然后,您将能够在稍后阶段引用每个人......
如果你必须使用Graphics类(这是更好的方法),那么你应该设置类似的东西,但用你自己的类替换Panel。然后在Form_Paint事件中,您将遍历对象列表并渲染它们。
class MyPanel
{
public Size size;
public Color color;
}
...
foreach (var myPanelRow in myPanelGrid)
foreach (var myPanel in myPanelRow)
g.FillRectangle(myPanel.color, myPanel.size); // this obviously won't work as is, but you get the idea
然后,当您需要更改颜色时,可以执行以下操作:
myPanelsGrid[0][0].color = Color.Blue;
myForm.Invalidate();
第二行将导致再次调用Paint in事件。