【问题标题】:C# Only refresh PictureBox/Panel when tell them to refresh?C#告诉他们刷新时只刷新PictureBox/Panel?
【发布时间】:2011-06-12 07:09:11
【问题描述】:

我正在 C# windows 窗体应用程序中制作炸弹人游戏。它有 300 多个画框(墙)放置在面板上。炸弹人本人的画框也在那个面板上。

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

我想控制面板的刷新事件(以及它的控件),因为我认为当只有需要刷新的图片框以编程方式刷新时,我的问题就解决了。

希望有人能帮帮我!

路德。

【问题讨论】:

  • 不要使用图片框。覆盖表单的 OnPaint() 方法并使用 e.Graphics.DrawImage() 绘制墙壁。

标签: c# refresh panel picturebox paint


【解决方案1】:

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

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

【讨论】:

  • 最后一段没有参数。
【解决方案2】:

您正在尝试绘制整个表格,这肯定需要时间。如果您只想更改表单的一部分,在您的情况下是将炸弹人移动到新位置,请仅使要重新绘制的区域无效,然后将其传递给 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

【讨论】:

  • 这已经自动发生了,根本不需要编写任何代码。
  • @Hans Passant。我有一种感觉,当您为控件指定新位置时,重绘会自动完成,但不确定是否比 x...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2012-08-31
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多