【问题标题】:Refresh part of a form not the whole thing刷新表单的一部分而不是全部
【发布时间】:2015-08-11 11:49:09
【问题描述】:

基本上我需要刷新部分表单的代码,而不是整个表单。

我使用 Visual Basic,我经常制作非常简单的游戏。我经常有一个 Player 或移动的不同对象,因为我没有发布我的代码,所以我不添加纹理。相反,我设置了一堆变量来保存 Playerlocationwidth,然后使用 e.graphics.FillRectangle... 等,效果很好,并说我移动它时我按了一个键,但没有任何反应,所以我必须写Refresh(),它有效,它会移动!

唯一的问题是当有很多对象时,比如 50+,每次程序运行 Refresh() 代码行时,整个 form白色持续一毫秒,通常我我一直在令人耳目一新,因为事情一直在变化,而这种形式只是一场癫痫的噩梦。

我知道我需要做什么,我只需要refresh整个表格的一小部分,我只是不知道该怎么做。

【问题讨论】:

  • 如果矩形没有按预期移动,你可能画错了,或者这是一个 XY 问题。 非常很难说没有代码。见:How to Ask
  • Invalidate 方法有参数选项。
  • 如果您移动某些东西并在它所在的位置进行绘制,它将在它离开的地方留下一个空白/未绘制的区域。

标签: vb.net refresh


【解决方案1】:

怎么做

你可以使用Invalidate方法来实现你想要的。

什么是无效

为了更好地理解下面的代码,你只需要知道Invalidate 做了什么。简单地说,它使您选择的整个control 无效,并强制它自己重绘

知道什么是无效的

选项 1

最简单的方法如下:

Me.Invalidate(New Region(New Rectangle(10, 10, 100, 100)))

通过这样做,您正在对表单的 (10,10) 位置的 100 width100 height 执行 invalidate(导致重绘)。

选项 2

如果选项 1 不能满足您的要求,我建议您使用 Increment 命名您的 rectangles,以便通过名称访问它们,例如 MyRectange1.Invalidate()MyRectangle2.Invalidate() 等等(很可能在循环中)。

选项 3

如果您不知道具体要刷新哪个rectangle 并且不想指定region,您可以将屏幕分成4 个部分(例如面板等容器)。然后你可以做这样的事情:panelBottomLeft.Invalidate()

或者像这样:

    For Each ControlToRefresh In panelBottomLeft.Controls
        ControlToRefresh.Invalidate()
    Next

【讨论】:

  • 这非常有用,而且效果很好,感谢 micbobo。
  • 没问题,很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2016-07-29
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多