注意:这个问题旨在帮助其他人找到我找不到的内容,并表示欢迎任何人提出比我想出的更好的解决方案。
我的挑战是在Windows窗体应用程序上生成一个平滑的滚动文本流,此外该窗体还有其他项目,因此我不得不在此过程中销毁它们。
我尝试移动一个文本框,用计时器和do...loops
等递增它,同时尝试再次使用Graphics.DrawString
递增位置。
所有这些都产生了一个生涩的输出,文本在移动时闪烁。
我花了几个小时谷歌搜索和浏览可能在50个不同的建议解决方案的区域,包括许多其他语言,希望我可能得到一个线索!
我无法确定哪一个给了我线索,但我看到了Doublebuffer
的几个引用,所以我用Google搜索(并且没有成功地尝试过它!)并最终提出了{{3}的想法一个手动缓冲区所以我最终得到....(见下面的答案)
答案 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
这样的仿制品 - 已经开启!)