我现在有下面的代码。加载表单后,将创建一个球并用鼠标移动,但是现在我想在mouseclick上创建一个Ball(FilledEllipse),然后将其显示在我单击的位置。总体目标是让它开始移动并在屏幕上反弹,以便我可以创建多个屏幕,但首先要做的是。我正在使用我创建的Ball类,该类仅设置球的半径。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Paint += Form1_Paint;
this.MouseMove += Form1_MouseMove;
this.MouseClick += Form1_MouseClick;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Point local = this.PointToClient(Cursor.Position);
e.Graphics.FillEllipse(Brushes.Red, local.X , local.Y , 20, 20);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Invalidate();
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
Random random = new Random();
Ball myBall = new Ball(random.Next(1, 5));
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
最佳答案
创建一个List<Ball>
并将在mouseclick上创建的球添加到此列表。
在OnPaint中,绘制列表中的每个球。
在OnClick中还调用Refresh,以刷新列表。
我在您的代码中添加了一些内容:
public partial class Form1 : Form
{
// Create list
List<Ball> _balls = new List<Ball>();
public Form1()
{
InitializeComponent();
this.Paint += Form1_Paint;
this.MouseMove += Form1_MouseMove;
this.MouseClick += Form1_MouseClick;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Point local = this.PointToClient(Cursor.Position);
e.Graphics.FillEllipse(Brushes.Red, local.X , local.Y , 20, 20);
// Paint each stored ball
foreach(var ball in _balls) {
// paint ball
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Invalidate();
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
Random random = new Random();
Ball myBall = new Ball(random.Next(1, 5));
// Store ball, and refresh screen
_balls.Add(myBall);
Invalidate()
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
要移动球,请在OnPaint上绘画前计算(每个球)的新位置。
考虑自上次OnPaint以来的时间来创建灵活的机芯。
我还能建议看看WPF吗?该库替代了Windows Forms,并包含许多绘画和动画解决方案。
关于c# - 如何使用Winforms在C#中的鼠标单击上绘制球?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4818581/