Vb.net 刷新表单的一部分而不是整个表单

Vb.net 刷新表单的一部分而不是整个表单,vb.net,refresh,Vb.net,Refresh,基本上,我需要刷新表单一部分的代码,而不是整个表单 我使用VisualBasic,我经常制作非常简单的游戏。我经常有一个播放器或不同的对象四处移动,因为我没有发布我的代码,所以我不添加纹理。相反,我设置了一组变量来保存播放器的位置和宽度,然后使用e.graphics.FillRectangle。。。等等,这很好,比如说我按下一个键时移动了它,但什么也没发生,所以我必须写Refresh(),它会移动 唯一的问题是,当有很多对象时,比如50+,每次程序运行Refresh()代码行时,整个表单在一毫秒

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

我使用VisualBasic,我经常制作非常简单的游戏。我经常有一个播放器或不同的对象四处移动,因为我没有发布我的代码,所以我不添加纹理。相反,我设置了一组变量来保存播放器的
位置
宽度
,然后使用
e.graphics.FillRectangle
。。。等等,这很好,比如说我按下一个键时移动了它,但什么也没发生,所以我必须写
Refresh()
,它会移动

唯一的问题是,当有很多对象时,比如50+,每次程序运行
Refresh()
代码行时,整个
表单在一毫秒内变为白色,通常我一直在刷新,因为东西一直在移动,表单只是变成了一场噩梦

我知道我需要做什么,我只需要刷新整个表单的一小部分,我只是不知道怎么做。

怎么做 您可以使用
Invalidate
方法来实现所需的功能

什么是无效 为了更好地理解以下代码,您只需知道
Invalidate
的作用。简单地说,它将使您选择的整个
控件无效,并强制它重新绘制自身

知道什么是无效的 选项1

最简单的方法如下:

Me.Invalidate(New Region(New Rectangle(10, 10, 100, 100)))
这样做就是在表单的
(10,10)
位置处的
100宽度和
100高度上执行
无效化
(导致重新绘制)

选项2

如果选项1不能满足您的要求,我建议您使用
增量来命名
矩形
,这样就可以通过名称访问它们,例如
MyRectange1.Invalidate()
MyRectangle2.Invalidate()
等等(最有可能在循环中)

选项3

如果您不知道要刷新哪个
矩形
,也不想指定一个
区域
,您可以将屏幕分成4个部分(例如面板等容器)。然后可以执行以下操作:
panelBottomLeft.Invalidate()

或者像这样:

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

如果矩形未按预期移动,则可能是绘制错误,或者这是XY问题。没有代码很难说。请参阅:该方法具有参数选项。如果您移动某个对象并仅在其所在位置绘制,将在其所在位置留下一个空白/未绘制的区域。这非常有用,工作非常完美,谢谢micbobo。没问题,很高兴我能帮上忙