C#只有在告诉他们刷新时才刷新PictureBox / Panel?

时间:2011-01-20 08:06:04

标签: c# refresh panel picturebox paint

我在C#windows窗体应用程序中制作炸弹人游戏。它有300多个放置在面板上的图片框(墙)。轰炸机本人的照片箱也在该小组上。

当炸弹人图片框的位置发生变化时,面板上的所有控件都会自动刷新。因为该面板上有如此多的控件,并且因为图片框的位置每秒更改多次,所以当我尝试移动时程序会变得迟钝。

我希望能够控制面板的刷新事件(以及它的控件),因为我认为只有需要刷新的图片框才能以编程方式刷新我的问题。

我希望有人可以帮我解决这个问题!

路德。

2 个答案:

答案 0 :(得分:0)

如果您移动孩子,则必须刷新父母,因为它可能需要绘制孩子之前所在的区域。这也意味着所有孩子(父母)都会得到更新。

OTH,使用如此多的控件可能不是一个好主意。我建议你保留描述墙的数据结构,然后用它在Panel(或你的自定义控件)中绘制它。您可以通过在Panel / Parent级别捕获鼠标/键盘事件来编写自己的命中测试逻辑(鼠标或键盘在墙边界内单击)。使用正确的组织数据结构,命中测试可以非常有效。

答案 1 :(得分:0)

您正在尝试绘制整个表单,这肯定需要时间。如果您只想更改表单的一部分(在您的情况下是将炸弹人移动到新位置),则仅使您要重绘的区域无效,然后将其传递给Invalidate方法。

做类似的事情。

//Invalidate previous position of bomberman
Rectangle invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height);
Invalidate(invalid);
//Add code to move your picture box and then call above two lines again
invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height);
Invalidate(invalid);

请注意,但是类似的抛光代码会起作用......

以下是参考示例的链接。 http://msdn.microsoft.com/en-us/library/ms229628.aspx