2017-10-06 118 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); 

應該解決您的問題。