vb.net - 在Windows窗体中重绘椭圆时如何停止闪烁

标签 vb.net winforms graphics paint flicker

我试图让一个球在屏幕上弹跳,除了每次移动时令人讨厌的闪烁之外,这主要是工作。

我已经搜索了一段时间,大多数网站都告诉你启用双缓冲,这有点帮助,但它仍然严重闪烁。

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

谢谢:)

我的代码:

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

最佳答案

如评论中所述,您应该始终使用 Paint 事件中的 Graphics 对象。要调用重绘,请在您的控件上调用 Invalidate()。不要使用 Refresh()(没那么糟糕)或 Application.DoEvents()(非常糟糕)来执行重绘。

奖励:获得非常流畅的绘图体验的专业提示

摆脱OnPaintBackground(),见my other answer here .

有了它,您将获得良好的渲染性能(对于 GDI+),我经常使用它。你可以在 here 上看到它在一个有趣的项目中,我分析了 WinForms 控件层次结构:WinFormsCT on GitHub .

WinFormsCT

关于vb.net - 在Windows窗体中重绘椭圆时如何停止闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497422/

相关文章:

c# - 左侧带有图像的标签 - 防止文本覆盖图片?

C# 控件超出父边界?

c# - C#/.net中简单游戏图形的最佳解决方案

c# - 迭代列表中的所有属性

c# - 外部注释以相反的顺序包含,.Net Visual Studio

javascript - 如何修复 RegisterClientScriptBlock 在 Visual Studio 中已过时警告

.net - 如何使用 SevenZipSharp 创建压缩的 SFX 文件?

c# - 如何在 TreeView 中突出显示节点?不仅是文本区域,还有所有行

java - 在背景图像上设置动画

java - 计算两个十六进制整数值的混合