2017-10-06 179 views
0

我有一个程序,在窗体内弹跳方块,我也必须让它每隔5秒绘制方块改变颜色,我有一个计时器来更新一个在每个盒子的坐标上的列表框以及间隔为5000的第二个定时器来改变正方形的颜色。现在我想弄清楚究竟如何我改变方块的颜色与定时器,我有一个方法叫colorchange一个叫rectcolorc#如何改变矩形的颜色,每5秒

private Color Rectcolor { get; set; } 

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

财产Form1我有一个foreach定时器2记号事件经历箱子

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真正改变矩形的颜色?

全框类别代码

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(); 
     } 
    } 

} 

}

+0

请为您的Box类提供代码。 – oRole

+0

它已更新 – alvintron

+0

你从哪里开始定时器? – JMA

回答

0

ColorChange()方法从来没有真正 '适用' 的Box类中Rectangle对象的新颜色。

在您的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; 
} 
+0

矩形更改但只有一秒钟,它重新绘制为蓝色 – alvintron

+0

不幸的是,由于缺少定时器的XAML和代码,我无法重建您的问题。你的计时器是否每秒钟都打勾? – oRole

+0

timer1的间隔为100,timer2的间隔为5000 – alvintron

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

这条线画一个蓝色的矩形。无论您将颜色设置为“myColor”,它都会呈现蓝色。将其更改为

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

应该解决您的问题。