Задать вопрос
@SurelL
Нагрузочный тестировщик

Как сделать так, чтобы рисунки не исчезали с picturebox?

Здравствуйте. Есть Windows Form, в которой - PictureBox. В нем рисуются круги при нажатии мышью. Координаты этих кругов записываются в List, чтобы в дальнейшем, при нажатии кнопки между кругами вырисовывались линии в рандомном порядке.
Сможете ли Вы подсказать, как сделать так, чтобы рисунок не исчезал? Получается, когда я прорисовываю линии уже в событии нажатия на клавишу, все круги стираются и остается просто белый фон
namespace UAV_MODELING
{
    public partial class Form1 : Form
    {
        Graphics gr;       //объявляем объект - графику, на которой будем рисовать
        Pen p;             //объявляем объект - карандаш, которым будем рисовать контур
        SolidBrush fig;    //и внутренности рисуемой фигуры
        int rad = 30;          // переменная для хранения радиуса рисуемых кругов
 
        static List<List<int>> coordinates = new List<List<int>>(); // Сюда записываем все координаты
        static List<int> usedCoordinates = new List<int>(); // Сюда записываем использованные координаты в процессе рандомного выбора
 
        public Form1()
        {
            InitializeComponent();
 
        }
 
        //опишем функцию, которая будет рисовать круг по координатам его центра
        public void DrawCircle(int x, int y)
        {
             
            gr.FillEllipse(fig, x, y, rad, rad);
 
            gr.DrawEllipse(p, x, y, rad, rad);
 
        }
 
        // Обработка события нажатия кнопки
        private void button1_Click(object sender, EventArgs e)
        {
            double speed;
            
            try
            {
                speed = Convert.ToDouble(textBox3.Text);
                setSpeed(speed);
            }
            catch
            {
                textBox3.Focus();
            }
 
            //timerMoving.Start();
 
            pictureBox1.Invalidate();
 
            gr = pictureBox1.CreateGraphics();
            p = new Pen(Color.Blue);
            
            int coordinatesNumber = coordinates.Count;
 
            Random random = new Random();
 
            int choice;
 
            int X_from = coordinates[0][0];
            int Y_from = coordinates[0][1];
            int X_to, Y_to;
            
            for (int i = 0; i < coordinatesNumber; i++)
            {
                do
                {
                    choice = random.Next(2, coordinatesNumber + 1);
                } while (!isFind(choice));
 
                X_to = coordinates[choice][0];
                Y_to = coordinates[choice][1];
 
                gr.DrawLine(p, X_from, Y_from, X_to, Y_to);
 
                usedCoordinates.Add(choice);
 
                X_from = X_to;
                Y_from = Y_to;
            }       
        }
        
        // Проверка наличия точки в списке использованных координат
        private bool isFind (int pointIndex)
        {
            foreach (int index in usedCoordinates)
            {
                if (index == pointIndex)
                    return true;
            }
            return false;
        }
 
        // Обработка события кликанья мышкой по pictureBox (для создания кругов)
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            gr = pictureBox1.CreateGraphics();  
            p = new Pen(Color.Blue);          
            fig = new SolidBrush(Color.Blue);
 
            int CurX = e.X;
            int CurY = e.Y;
 
            DrawCircle(CurX, CurY);
 
            fig.Dispose();
            p.Dispose();
            gr.Dispose();
            List<int> point = new List<int>();
            point.Add(CurX);
            point.Add(CurY);
            coordinates.Add(point);
        }
 
    }
}
  • Вопрос задан
  • 991 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
1. Не рисуй на контролах! Для этого сделай new Image() и рисуй там, а результат отображай в picturebox.
Bitmap img = (Bitmap)Image.FromFile("image.jpg");
Pen pen = new Pen(Color.Red, 2);

using (var graphics = Graphics.FromImage(img))
{
    graphics.DrawRectangle(pen, new Rectangle(10, 10, 5, 5));
}

this.image.Image = img;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы