#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 и таймер и аннулируйте при рисовании галочки всегда полную сетку до нового количества ячеек..