Перерисовка рисунка picturebox без мерцания или задержки

#c# #forms #mouseevent #picturebox

#c# #формы #mouseevent #picturebox

Вопрос:

Я нарисовал сетку на picturebox с помощью .затем я разрешаю пользователям щелкнуть ячейку в этой сетке, чтобы изменить цвет. Я делаю это, устанавливая значение цвета для каждой ячейки (щелчок устанавливает его равным 1)

Единственный способ, которым я могу обновить его, — это щелкнуть мышью, что вызывает проблемы с алгоритмами поиска путей, которые я тестирую. Я попытался поставить его на таймер, но он слишком сильно мерцает.

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

 private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            GetX(this, e);
            GetY(this, e);
            if (DrawCase == "Wall") {
                if (gridmatrix[XClick, YClick].COLOUR == 0) //If tile is white and left mouse is pressed
                {
                    gridmatrix[XClick, YClick].COLOUR = 1; //Set colour to 1 (place a wall)
                }
                else if (gridmatrix[XClick, YClick].COLOUR == 1) //If tile is a wall and left mouse is pressed
                {
                    gridmatrix[XClick, YClick].COLOUR = 0; //Set to empty
                }
        }
 

Сетка обновляется при наведении курсора мыши… (Как еще я мог обновить сетку?)

 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        mousedown = false;
        int rowcolumn = Convert.ToInt32(textBox1.Text); //Gets the dimensions from the users input

        cellsize = (pictureBox1.Width / rowcolumn);
        if (pictureBox1.Image == null)//if no available bitmap exists on the picturebox to draw on

        {
            //create a new bitmap
            Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

            pictureBox1.Image = bmp; //assign the picturebox.Image property to the bitmap created

        }


        for (int i = 0; i < gridmatrix.GetLength(0); i  )
        {
            for (int j = 0; j < gridmatrix.GetLength(1); j  )
            {
                Rectangle rect = new Rectangle(gridmatrix[i, j].X * cellsize, reverseYvalues[gridmatrix[i, j].Y] * cellsize, cellsize, cellsize); //Positioning and sizing for the rectangle



                if (gridmatrix[i, j].COLOUR == 0)
                {
                    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
                    {
                        g.FillRectangle(Brushes.White, rect);
                    }
                }
                else if (gridmatrix[i, j].COLOUR == 1)
                {
                    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
                    {
                        g.FillRectangle(Brushes.Blue, rect);
                    }


                }

            }
        }
    }
 

Комментарии:

1. Рисование должно выполняться в событии рисования

2. Я не могу нарисовать сетку таким образом, потому что сначала мне нужны размеры из текстового поля

3. событие рисования запускается только при выходе из программы.

4. Событие рисования вызывается вызовом pbox . Аннулирование, возможно, из события pbox_MouseClick. — Но реальный вопрос заключается в том, следует ли рисовать в растровом изображении (откуда бы вы ни захотели) или рисовать в PictureBox (всегда из события рисования!).).

5. Может быть, вы хотите, чтобы заполнение происходило медленно, как в анимации? Для этого действительно используйте Paint и таймер и аннулируйте при рисовании галочки всегда полную сетку до нового количества ячеек..