PictureBox.Paint事件持续发生
本文关键字:Paint 事件 PictureBox | 更新日期: 2023-09-27 18:00:20
我的PictureBox.Paint事件一直在发生,我不知道是什么原因导致的。
private void GamePictureBox_Paint(object sender, PaintEventArgs e)
{
DrawMap(e.Graphics);
}
public void DrawMap(Graphics g)
{
lock (MainBlock)
{
for (int RectsX = 0; RectsX < GamePictureBox.Width - 1; RectsX += (int)MainBlock.RectSize.X)
for (int RectsY = 0; RectsY < GamePictureBox.Height - 1; RectsY += (int)MainBlock.RectSize.Y)
g.DrawRectangle(MainBlock.BlockColor, RectsX, RectsY, MainBlock.RectSize.X, MainBlock.RectSize.Y);
Invoke((MethodInvoker)(() =>
{
GamePictureBox.Invalidate();
GamePictureBox.Update();
}));
}
}
GamePictureBox.Width和GamePictureBox.Height=601;MainBlock.RectSize.X和MainBlock.RctSize.Y=60.1f;主要问题是,在DrawMap内的2个for循环完成后,Paint事件再次调用DrawMap!这种情况一直在发生(无限循环),有点烦人。我试过调试,但我的调试技能只让我知道问题的原因是Paint事件。
该事件称为NOWHERE,而不是"绘制"事件。
在"绘制"事件中,应仅在图形上绘制,即不绘制Invoke()。
引用Control.Update上的MSDN文档:"使控件在其客户端区域内重新绘制无效区域。"
引用有关Control.Paint事件的MSDN文档:"在重新绘制控件时发生。"
因此,当调用GamePictureBox.Update();
时,将触发一个新的"绘制"事件。使用Invalidate+Update删除整个部分,这是在需要新渲染的内容发生更改时使用的(例如,在您的场景中,如果MainBlock.BlockColor发生更改,则需要触发新事件)。