在Windows窗体中重新绘制椭圆时如何停止闪烁

tom*_*tom 3 vb.net graphics paint flicker winforms

我试图使球在屏幕上弹跳,这主要是与每次移动时令人讨厌的闪烁分开。

我已经搜索了一段时间,大多数站点都告诉您启用双缓冲,这虽然有所帮助,但仍然闪烁不佳。

有人对如何解决此问题有任何建议吗?

谢谢 :)

我的代码:

Imports System.Drawing
Public Class Form1

    Public gr As Graphics
    Public XSpeed As Integer = 2
    Public YSpeed As Integer = 2
    Public ParticleCoord(1) As Integer
    Public Blackbrush As New SolidBrush(Color.Black)



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gr = Me.CreateGraphics()

        YSpeed = CInt(Math.Ceiling(Rnd() * 10))
        XSpeed = CInt(Math.Ceiling(Rnd() * 10))

        ParticleCoord = {50, 50}

        Timer.Enabled = True

    End Sub

    Private Sub ParticleMove(ByRef XSpeed, ByRef YSpeed)
        If (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) And (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        ElseIf (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) Then
            YSpeed = -YSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        ElseIf (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
            XSpeed = -XSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        Else
            YSpeed = -YSpeed
            XSpeed = -XSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
        End If
    End Sub

    Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick
        ParticleMove(XSpeed, YSpeed)
    End Sub


End Class
Run Code Online (Sandbox Code Playgroud)

Wae*_*her 8

如注释中所述,您应始终使用-event中的Graphics对象Paint。要调用重绘,请调用Invalidate()控件。千万不能使用Refresh()(不坏)或Application.DoEvents()(非常糟糕)进行重绘。

奖励:Pro-Tip带来非常流畅的绘画体验

摆脱掉OnPaintBackground()在这里看到我的其他答案

这样,您将获得良好的渲染性能(对于GDI +),我经常使用它。你可以看到它在这里的一个有趣的项目我做分析的WinForms控制层:WinFormsCT GitHub上

WinFormsCT