我现在有下面的代码。加载表单后,将创建一个球并用鼠标移动,但是现在我想在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/

10-11 19:40