C#通过鼠标点击在picturebox中绘制类中的图形

本文关键字:绘制 图形 picturebox 鼠标 | 更新日期: 2023-09-27 18:20:01

我想用我在一个单独的类(Paintball)中创建的方法(paint)绘制图形对象。我希望只有当我用鼠标左键点击时,它才能在图片框中绘制,并且我希望我拍摄的点存储在列表中。当我尝试下面的代码时,它不会射击。下面是彩球课。

{
    private List<Point> myClick;
    public Paintball()
    {                 
        myClick = new List<Point>();
    }
    public void add(Point location)
    {
        myClick.Add(location);                    
    }
    public void paint(Graphics g, Point point)
    {
        g.FillEllipse(Brushes.Blue, point.X, point.Y, 20, 20);
    }
}

}

这是下面的表格1。

namespace AmazingPaintball
{
    public partial class Form1 : Form
    {
        Random positionX = new Random();
        Random positionY = new Random();
        Target einstein;
        int count;
        List<Point> ballList = new List<Point>();
        Paintball gun; 
        public Form1()
        {
            InitializeComponent();
            Point point = new Point(positionX.Next(0, 638), positionY.Next(0, 404));
            einstein = new Target(point);
            ptrEinstein.Location = point;
            gun = new Paintball();               
        }       
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            ptrEinstein.Location = einstein.Move(e.KeyData);
            pictureBox1.Update();
            pictureBox1.Refresh();           
        }


        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            count++;
            gun.add(e.Location);
            pictureBox1.Refresh();

        }
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            foreach (var Paintball in ballList)
            {
                gun.paint(e.Graphics, this.PointToClient(Cursor.Position));
                pictureBox1.Refresh();               
            }                        
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            pictureBox1.Refresh();
        }       
    }
}

如果你知道需要编辑/创建什么,请告诉我。谢谢

C#通过鼠标点击在picturebox中绘制类中的图形

您的原始代码有很多错误。让我们试着简化你正在做的事情,简单地存储一个点列表并将它们绘制到图片框中。

public partial class Form1 : Form
{        
    List<Point> ballList = new List<Point>();        
    public Form1()
    {
        InitializeComponent();
    }
    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {           
        ballList.Add(e.Location);
        pictureBox1.Refresh();
    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        foreach (Point pBall in ballList)
        {
            e.Graphics.FillEllipse(Brushes.Blue, pBall.X, pBall.Y, 20, 20);
        }
    }
}

这里我们有一个列表,我们在点击处理程序中添加点击点,并在绘制处理程序中绘制它们。一旦你对此感到满意,也许可以转到程序中的下一个任务,如果你对下一个功能感到困惑,可以问一个新问题。


好的,我有一点时间,让我们看看你的彩弹课。我已经将其重命名为Paintballs,因为它包含了许多内容,而且这个名称更合适。如果你想保持点列表的私有性,那没关系。你试图在类中实现一个Paint方法,但它以Point为参数,并且不对类的任何实例状态进行操作——这可能不是你想要的。现在考虑:

public class Paintballs
{
    private List<Point> myClick;
    public Paintballs()
    {
        myClick = new List<Point>();
    }
    public void Add(Point location)
    {
        myClick.Add(location);
    }
    public void Paint(Graphics g)
    {
        foreach (Point p in myClick)
        {
            g.FillEllipse(Brushes.Blue, p.X, p.Y, 20, 20);
        }
    }
}

这里我们有一个公共的Paint方法,它将把类中的所有彩弹绘制到你传递给它的任何图形实例中

public partial class Form1 : Form
{
    Paintballs pBalls = new Paintballs();
    public Form1()
    {
        InitializeComponent();
    }
    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
        pBalls.Add(e.Location);
        pictureBox1.Refresh();
    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        pBalls.Paint(e.Graphics);
    }
}

因此,我们通过将绘画方法推入彩弹类本身来简化表单代码。这使得类负责知道彩弹是什么样子的,有多少,它们在哪里,以及如何将它们绘制到Graphics对象。这是封装责任的第一步。

您正在根据存储在ballList变量中的点列表进行绘制。但是,您从未在该列表中添加任何点数。

将Paintball中的myClick列表设为公共列表,并在pictureBox1_Paint方法中迭代该列表,而不是ballList