c#如何每5秒更改一次矩形的颜色

时间:2017-10-06 07:30:43

标签: c# oop timer colors drawrectangle

我有一个程序在表单中有弹跳方块,我还必须使它每5秒绘制的方块改变颜色,我有一个计时器来更新每个框的坐标上的列表框和第二个计时器以5000的间隔来改变正方形的颜色。现在我想弄清楚我是如何使用计时器更改方块的颜色,我有一个名为colorchange的方法,其中包含一个名为rectcolor的属性

 private Color Rectcolor { get; set; }

 }
    public Color Colorchange()
    {
        Rectcolor =  Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256));
        return Rectcolor;
    }

Form1中我有一个timer2 tick事件,foreach通过方框

 public partial class Form1 : Form
{
    Random Randcolor = Box.randcolor;
    Random Rand = Box.rand;
    List<Box> Boxes = new List<Box>();

    public Form1()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.UserPaint, true);

    }
    private void timer2_Tick(object sender, EventArgs e)
    {
        foreach (Box tmp in Boxes)
        {
            tmp.Colorchange();
        }
    }

当我运行程序时,移动的矩形没有任何反应,我如何让colorchange实际改变矩形的颜色?

Full Box类代码

class Box
{
    protected Rectangle myRectangle;
    protected int xStep;
    protected int yStep;
    protected Form pForm;
    protected Label myLocation;
    protected Color myColor;
    public static Random rand = new Random();
    public static Random randcolor = new Random();

    public Box(int x, int y, int s, Form pF)
    {
        myColor = new Color();
        myColor = Colorchange();
        myLocation = new Label();
        myLocation.BackColor = Color.Transparent;
        myLocation.Left = x;
        myLocation.Top = y;
        myLocation.ForeColor = Colorchange();
        pF.Controls.Add(myLocation);
        pForm = pF;
        myRectangle = new Rectangle(x, y, s, s);
        myRectangle.X = x;
        myRectangle.Y = y;
        xStep = rand.Next(1, 15);
        yStep = rand.Next(1, 15);
    }

    public int X { get { return myRectangle.X; } }
    public int Y { get { return myRectangle.Y; } }
    private int Width { get { return myRectangle.Width; } }
    private int Height { get { return myRectangle.Height; } }
    private Color Rectcolor { get; set; }
    public void Move()
    {
        myRectangle.X += xStep;
        myRectangle.Y += yStep;
        if (myRectangle.X <= 0)
            xStep *= -1;
        if (myRectangle.X + myRectangle.Width >= pForm.ClientSize.Width)
            xStep *= -1;
        if (myRectangle.Y <= 0)
            yStep *= -1;
        if (myRectangle.Y + myRectangle.Height >= pForm.ClientSize.Height)
            yStep *= -1;
        //if (myRectangle.X >500)
        //    xStep *= -1;

    }
    public Color Colorchange()
    {
        Rectcolor =  Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256));
        return Rectcolor;
    }


    public static bool Bounce(Box One, Box Two)
    {
        if (One.X + One.Width < Two.X)
            return false;
        if (Two.X + Two.Width < One.X)
            return false;
        if (One.Y + One.Height < Two.Y)
            return false;
        if (Two.Y + Two.Height < One.Y)
            return false;
        return true;
    }
    //public void collision()
    //{

    //    xStep *= -1;
    //    yStep *= -1;
    //}
    public void Draw(Graphics g)
    {
        g.DrawRectangle(new Pen(Color.Blue), myRectangle);

        myLocation.Top = myRectangle.Y -15;
        myLocation.Left = myRectangle.X+(myRectangle.Width/4);
        myLocation.Text = myRectangle.X.ToString() + ", " + myRectangle.Y.ToString();

    }

我在buttone点击启动计时器,我会给你form1

  public partial class Form1 : Form
{
    Random Randcolor = Box.randcolor;
    Random Rand = Box.rand;
    List<Box> Boxes = new List<Box>();

    public Form1()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.UserPaint, true);

    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Box tmp = new Box(100, 100, 40);
        // Boxes.Add(tmp);
        for (int x = 1; x < 10; x++)
        {
            Boxes.Add(
                new Box(
                    Rand.Next(100 + x * 10, this.ClientSize.Width - 100),
                Rand.Next(100 + x * 10, this.ClientSize.Height - 100),
                Rand.Next(100 + x * 15), this));

            //Boxes.Add(new Box(100 + x * 10, 100 + x * 10, x * 15, this));

        }
        timer1.Enabled = true;
        timer2.Enabled = true;

    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        foreach (Box tmp in Boxes)
        {
            tmp.Draw(e.Graphics);

        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        foreach (Box tmp in Boxes)
        {
            tmp.Move();
            listBox1.Items.Add(tmp.X + ", " + tmp.Y);
        }
        this.Invalidate(false);


    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void timer2_Tick(object sender, EventArgs e)
    {
        foreach (Box tmp in Boxes)
        {
            tmp.Colorchange();
        }
    }

}

}

2 个答案:

答案 0 :(得分:0)

您的ColorChange()方法从未真正适用&#39; Rectangle类中Box对象的新颜色。

Box课程中,您需要一个新的Graphics对象。您可以将其设置为字段或将其作为构造函数的参数传递,因为您正在Draw()方法中使用它。

        private Graphics g;

        ...

        public Box(int x, int y, int s, Form pF)
        {
            g = pF.CreateGraphics();

            ...
        }

您还必须修改ColorChange()方法,以便Rectangle填充到所需的颜色:

public Color Colorchange()
{
    this.Rectcolor = Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256));

    // You need to fill the rectangle with the desired color again
    this.g.FillRectangle(new SolidBrush(this.Rectcolor), this.myRectangle);
    return Rectcolor;
}

答案 1 :(得分:0)

g.DrawRectangle(new Pen(Color.Blue), myRectangle);

此行绘制一个蓝色矩形。无论你设置为“myColor”的颜色是什么,它都会呈现蓝色。将此更改为

g.DrawRectangle(new Pen(myColor), myRectangle);

应该解决您的问题。