如何在 Windows 窗体应用程序中创建新对象时防止以前绘制的对象消失

本文关键字:对象 消失 绘制 窗体 Windows 应用程序 新对象 创建 | 更新日期: 2023-09-27 17:56:17

我的问题是,在我的 Windows 窗体应用程序中,我想在每次在特定图片框中单击鼠标时绘制一个椭圆,并且我希望以前绘制的省略号保留在图片框中。

在当前状态下,单击鼠标后,先前绘制的椭圆将替换为在光标新位置绘制的新椭圆。

Ball.Paint 绘制一个椭圆。

以下是问题的相关代码:

    private Ball b;
    private void pbField_Paint(object sender, PaintEventArgs e)
    {
        if (b != null)
            b.Paint(e.Graphics);
    }
    private void pbField_MouseClick(object sender, MouseEventArgs e)
    {           
        int width = 10;
        b = new Ball(new Point(e.X - width / 2, e.Y - width / 2), width);
        Refresh();
    }

如果还有更多需要的代码或信息,我可以提供。

如何在 Windows 窗体应用程序中创建新对象时防止以前绘制的对象消失

您需要某种数据结构来存储先前的省略号。 一种可能的解决方案如下:

private List<Ball> balls = new List<Ball>(); // Style Note:  Don't do this, initialize in the constructor.  I know it's legal, but it can cause issues with some code analysis tools.
private void pbField_Paint(object sender, PaintEventArgs e)
{
    foreach(Ball b in balls)
    {
        if (b != null)
        {
            b.Paint(e.Graphics);
        }
    }
}
private void pbField_MouseClick(object sender, MouseEventArgs e)
{           
    int width = 10;
    b = new Ball(new Point(e.X - width / 2, e.Y - width / 2), width);
    balls.Add(b);
    Refresh();
}

如果你想画多个球,你需要跟踪一个球列表,而不仅仅是b。 每次刷新控件时,都应重绘其所有内容。 这意味着在 pbField_Paint 中,您需要准备好绘制已添加到场景中的尽可能多的球。