顺畅滚动文字(如突发新闻......)

时间:2016-02-29 13:17:54

标签: vb.net winforms buffer

注意:这个问题旨在帮助其他人找到我找不到的内容,并表示欢迎任何人提出比我想出的更好的解决方案。

我的挑战是在Windows窗体应用程序上生成一个平滑的滚动文本流,此外该窗体还有其他项目,因此我不得不在此过程中销毁它们。

我尝试移动一个文本框,用计时器和do...loops等递增它,同时尝试再次使用Graphics.DrawString递增位置。 所有这些都产生了一个生涩的输出,文本在移动时闪烁。

我花了几个小时谷歌搜索和浏览可能在50个不同的建议解决方案的区域,包括许多其他语言,希望我可能得到一个线索!

我无法确定哪一个给了我线索,但我看到了Doublebuffer的几个引用,所以我用Google搜索(并且没有成功地尝试过它!)并最终提出了{{3}的想法一个手动缓冲区所以我最终得到....(见下面的答案)

1 个答案:

答案 0 :(得分:0)

Do
        Dim currentContext As BufferedGraphicsContext
        Dim myBuffer As BufferedGraphics
        ' Gets a reference to the current BufferedGraphicsContext.
        currentContext = BufferedGraphicsManager.Current
        ' Creates a BufferedGraphics instance associated with Form1, and with 
        ' dimensions the same size as the drawing surface of Form1.
        myBuffer = currentContext.Allocate(BNP1.CreateGraphics, BNP1.DisplayRectangle)
        'update test
        With myBuffer
            .Graphics.Clear(Panel.BackColor)
            .Graphics.DrawString("Some Text", [Your Font], Brushes.Blue, xpos, ypos)
        End With
        myBuffer.Render()
        myBuffer.Dispose()
        'This bit will need adjusting to suit your layout!
        If xpos + Panel.Width < Panel.Left Then xpos = Panel.Right Else xpos -= 1
        Thread.Sleep(1)
Loop

使用睡眠时间和xpos减少,这产生了一个完全平滑的滚动,具有完全可调的滚动速度。

正如您可能会注意到我在一个单独的线程中使用Do...Loop执行此操作时,它也适用于计时器但由于某种原因滚动速度(有人可能会解释)的速度要慢得多。

免责声明:我不是一名专业的程序员,所以如果有人提出改进我所做的建议,我会非常感激(避免使用Option Strict这样的仿制品 - 已经开启!)