Динамическое создание PictureBox при клике мышью по форме

Penigina

Здравствуйте! Сегодня решил спросить. А можно сделать так чтобы при каждом нажатии мыши на форме создавался новый pictureBox и делал какое-то действие(двигался)? Как это реализовать? Знаю что нужно создать класс... но как... не знаю... Спасибо за ответ...
11 ответов

Penigina

Здравствуйте! Сегодня решил спросить. А можно сделать так чтобы при каждом нажатии мыши на форме создавался новый pictureBox и делал какое-то действие(двигался)? Как это реализовать? Знаю что нужно создать класс... но как... не знаю... Спасибо за ответ...
Поставьте, пожалуйста, конкретнее задачу, я понял что нужно создавать каждый раз pictureBox, а что еще? Двигаются все какие до этого были или как?


Penigina

Каждый новый pictureBox меняет свои координаты в таймере таким образом. pb.Location = new Point(pb.Location.X + 2, pb.Location.Y - 2); //тоесть идёт по диагонали вверх в правую сторону. Каждый новый pictureBox создаётся в точке (0,ClientSize.Height); (нижний левый угол)


Penigina

 
//Это event твоей формы
        private void Form_MouseClick(object sender, MouseEventArgs e)
        {
            PictureBox pb = new PictureBox();// создает PictureBox 
//здесь можешь сделать то что нужно с PictureBox 
            
 
        }


Penigina

Это я знаю... По другому никак?


Penigina

Это я знаю... По другому никак?
Счас жди, напишу)


Penigina

Жду))))


Penigina

Я уже сделал давно) Но борюсь с тем, что после выхода остается приложение в процесах) Еще пару минут.
public partial class Form1 : Form
    {
        // создаем delegate и к нему event, которые будут исполнять функцию движения.
        private delegate void MoveControlHandler(PictureBox pictureBox);
        private event MoveControlHandler _moveControl;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void MoveControl(PictureBox pictureBox)
        {
            // работает, пока не будет закрыта программа.
            while (!this.IsDisposed) 
            {
                pictureBox.Location = new Point(pictureBox.Location.X + 2, pictureBox.Location.Y - 2);
 
                // когда картинка дойдет до вверху экрана.
                if (pictureBox.Location.Y == (0 - pictureBox.Height))
                {
                    pictureBox.Location = new Point(0, this.Height - pictureBox.Height);
                }
                // время изменения расположения картинки.
                Thread.Sleep(10);
            }
        }
 
        
        private PictureBox CreateControl()
        {
            // создаем наш pictureBox.
            PictureBox pictureBox = new PictureBox();
            // подгружаем картинку.
            pictureBox.Load("1.jpg");
            // задаем начальные координаты
            pictureBox.Location = new Point(0, this.Height - pictureBox.Height);
            // добавляем к нашей форме
            this.Controls.Add(pictureBox);
            return pictureBox;
        }
 
        private void Form1_Click(object sender, EventArgs e)
        {
            // создаем поток функции движения картинки
            new Thread(StartMove).Start(CreateControl());
        }
 
        private void StartMove(object pictureBox)
        {
            _moveControl += MoveControl;
            _moveControl.Invoke((PictureBox) pictureBox);
        }
    }


Penigina

Ок))...................


Penigina

Ок))...................
Посмотри) если че по комментариям думаю сумеешь изменить как тебе нужно=)Если хочешь можно и без delegate и event.
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void MoveControl(object pictureBox)
        {
            PictureBox pb = (PictureBox) pictureBox;
            while (!this.IsDisposed)
            {
                pb.Location = new Point(pb.Location.X + 2, pb.Location.Y - 2);
                if (pb.Location.Y == -pb.Height)
                {
                    pb.Location = new Point(0, this.Height - pb.Height);
                }
                Thread.Sleep(10);
            }
        }
 
        private PictureBox CreateControl()
        {
            PictureBox pictureBox = new PictureBox();
            pictureBox.Load("1.jpg");
            pictureBox.Location = new Point(0, this.Height - pictureBox.Height);
            this.Controls.Add(pictureBox);
            return pictureBox;
        }
 
        private void Form1_Click(object sender, EventArgs e)
        {
            new Thread(MoveControl).Start(CreateControl());
        } 
    }


Penigina

У меня почему-то в обеих случаях ошибка "Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on."У меня почему-то в обеих случаях ошибка "Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on." Подчёркивает "pb.Location = new Point(pb.Location.X + 2, pb.Location.Y - 2);"У меня почему-то в обеих случаях ошибка "Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on." Подчёркивает "pb.Location = new Point(pb.Location.X + 2, pb.Location.Y - 2);"


Penigina

Запускай CTRL+F5)))А если хочешь окладчиком пользоватся, то нужно как-то заменить new Point, так как в потоке нельзя создавать новые объекты или специально использовать делегат.