C # рисовать графику из класса в картинке с помощью мыши

1

Я хочу нарисовать графический объект из метода (paint), который я создал в отдельном классе (Paintball). Я хочу, чтобы он рисовал в картинке только тогда, когда я левой кнопкой мыши с помощью мыши, и я хочу, чтобы точка, в которой я стрелял, была сохранена в списке. Когда я пытаюсь выполнить код ниже, он не стреляет. Ниже представлен класс Paintball.

{
    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();
        }       
    }
}

Пожалуйста, дайте мне знать, знаете ли вы, что нужно отредактировать/создать. Спасибо

  • 0
    Это полно ошибок. Вы вызываете Refresh в обработчике Paint - это вызовет бесконечный цикл. Ваш класс по пейнтболу - это просто список, но вы не выставляете элементы, ваш список ballList никогда не используется, но вы пытаетесь нарисовать его содержимое ... предлагаю вам решить более простую задачу и решить каждую из них по мере изучения. Вы пытаетесь сделать слишком много одновременно и делаете так много ошибок, что вы действительно не можете исправить этот код, не начав заново с нуля.
Теги:

2 ответа

4
Лучший ответ

В вашем исходном коде много ошибок. Попробуйте упростить то, что вы делаете, и решить, просто хранить список точек и рисовать их в окне изображения.

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. Это шаг 1, заключающий ответственность.

  • 0
    Хорошо, попробую это.
  • 0
    Кажется, даже не создавать графический объект в pictureBox1.
Показать ещё 3 комментария
0

Вы рисуете из списка точек, хранящихся в этой переменной ballList. Однако вы никогда не добавляли никаких точек в этот список.

Сделать список myClick в Paintball общедоступным, а в методе pictureBox1_Paint - перебирать этот список вместо ballList.

  • 0
    Я пытался сделать myClick общедоступным, но компилятор не распознает его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню