我有一个程序在表单中有弹跳方块,我还必须使它每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();
}
}
}
}
答案 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);
应该解决您的问题。