【发布时间】:2015-10-16 17:05:43
【问题描述】:
我想知道,有没有一种简单的方法可以只更新一部分图形?在下面的例子中,我画了 1560 个 10x10px 的小方块,并将其中的 3 个涂成蓝色。这需要相当长的时间(大约 1 秒),可以看到它们是如何在屏幕上绘制的。在下一步中,我想将 3 个蓝色方块移动到不同的位置,这意味着我想保留所有绘制的图形,但是只将 3 个方块重新绘制为灰色,并将另外 3 个方块绘制为蓝色。 如果我完全重新绘制图片,大约需要“很多”时间。 1秒。上文提到的。我想达到每秒至少几帧,因为我正在做一个小的“动画”模拟。这意味着,代码不必很性感,但要足够简单,可以在寿命很短的程序中使用。
Button4_click 代码中所描绘的方法很快,但只是因为仅绘制了新的方块,抹去了旧的图形。
请注意,我在 Panel1 上而不是 PictureBox1 上绘画,因为性能方面的建议(避免一些不必要的事件处理程序和刷新)。
草图测试代码:
Private drawPattern As Boolean = False
Private drawBlueRects As Boolean = False
Dim blueBrush As New SolidBrush(Color.Blue)
Dim grayBrush As New SolidBrush(Color.Gray)
Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
Dim g As Graphics = e.Graphics
If drawPattern Then
Dim StartY As Integer = 250 - 60 ' just set Y for upper set of squares
For ir = 1 To 6 ' paint upper set of squares
For ic = 0 To 120
g.DrawRectangle(New Pen(Color.Gray), 5 + ic * 10, StartY + ir * 10, 8, 8)
Next
Next ir
StartY = 250 + 10 ' just set Y for bottom set of squares
For ir = 1 To 6 ' paint bottom set of squares
For ic = 0 To 120
g.DrawRectangle(New Pen(Color.Gray), 5 + ic * 10, StartY + ir * 10, 8, 8)
Next
Next ir
For ic = 0 To 120 ' paint middle set of squares
g.FillRectangle(grayBrush, 5 + ic * 10, 250 + 10, 8, 8)
Next
' paint 3 blue squares
g.FillRectangle(blueBrush, 155, 250 + 10, 8, 8)
g.FillRectangle(blueBrush, 165, 250 + 10, 8, 8)
g.FillRectangle(blueBrush, 175, 250 + 10, 8, 8)
ElseIf drawBlueRects = True Then
' paint 3 blue squares
g.FillRectangle(blueBrush, 255, 250 + 10, 8, 8)
g.FillRectangle(blueBrush, 265, 250 + 10, 8, 8)
g.FillRectangle(blueBrush, 275, 250 + 10, 8, 8)
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
drawPattern = True
Panel1.Refresh()
'Panel1.Refresh()
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
drawPattern = False
drawBlueRects = True
Panel1.Refresh()
End Sub
如果我用谷歌搜索了一个现成的解决方案,我深表歉意;在这种情况下请提供链接。
问候,
Libor
【问题讨论】: