C#仅在告诉他们刷新时刷新图片盒/面板?
我正在用C#windows窗体应用程序制作一个bomberman游戏。它有300多个图片盒(墙)放在一个面板上。bomberman本人的图片盒也在该面板上 当bombermans picturebox的位置更改时,面板上的所有控件都会自动刷新。由于该面板上有太多控件,并且picturebox的位置每秒更改多次,因此当我尝试移动时,程序会变得滞后 我想控制面板的刷新事件(及其控件),因为我认为只有需要刷新的PictureBox以编程方式刷新时,问题才得以解决 我希望有人能帮我解决这个问题C#仅在告诉他们刷新时刷新图片盒/面板?,c#,refresh,panel,picturebox,paint,C#,Refresh,Panel,Picturebox,Paint,我正在用C#windows窗体应用程序制作一个bomberman游戏。它有300多个图片盒(墙)放在一个面板上。bomberman本人的图片盒也在该面板上 当bombermans picturebox的位置更改时,面板上的所有控件都会自动刷新。由于该面板上有太多控件,并且picturebox的位置每秒更改多次,因此当我尝试移动时,程序会变得滞后 我想控制面板的刷新事件(及其控件),因为我认为只有需要刷新的PictureBox以编程方式刷新时,问题才得以解决 我希望有人能帮我解决这个问题 Ruud
Ruud.如果移动子对象,则必须刷新父对象,因为它可能需要绘制子对象以前所在的区域。这也意味着(父项的)所有子项都将刷新
另外,使用这么多控件可能不是一个好主意。我建议您保留描述墙的数据结构,然后使用它在面板(或自定义控件)中绘制墙。通过在面板/父级捕获鼠标/键盘事件,您可以编写自己的命中测试逻辑(在墙边界内单击鼠标或键盘)。有了正确的组织数据结构,命中测试可以非常有效。您正在尝试绘制整个表单,这肯定需要时间。如果只想更改表单的一部分(在本例中是将bomberman移动到新位置),请仅使要重新绘制的区域无效,然后将其传递给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);
请注意,当然,但有一点类似的抛光代码可以工作
下面是一个链接,指向一个示例以供参考 这已经自动发生了,根本不需要编写任何代码。@Hans Passant。我有一种感觉,当你为一个控件指定一个新的位置时,重新绘制是自动完成的,但不确定它是否正确…最后一段没有参数。不要使用图片框。重写窗体的OnPaint()方法,并使用e.Graphics.DrawImage()绘制墙。