绘制多个矩形c#

时间:2012-11-28 00:12:57

标签: c#

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

2 个答案:

答案 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事件。