2

在 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;
    }
}
4

2 回答 2

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..
        }
    }    
}
于 2012-11-28T00:55:59.947 回答
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 事件再次被调用。

于 2012-11-28T00:54:44.343 回答