Hallo,
die DoubleBuffered-Eigenschaft funktioniert wohl nur für das Zeichnen im Paint-Ereignis, das damit gepuffert wird und kein Flackern mehr aufweist. Beim Zeichnen auf ein mit CreateGraphics() geholtes Graphics-Objekt tritt bei mir das Flackern trotz aktivierter DoubleBuffered-Eigenschaft noch auf.
Earny, falls es bei dir auch so ist, versuch mal, zusätzlich zu Manfreds Zeile (Me.DoubleBuffered = True) das Zeichnen nun im Paint-Ereignis zu machen, z.B. so:
Private Stift As New Pen(Color.Blue, 5)
Private Pinsel As New SolidBrush(Color.Red)
Private RechteckTimerTick As Integer = 0
Public Sub New()
InitializeComponent()
Me.DoubleBuffered = True
End Sub
Private Sub RechteckTimer_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles RechteckTimer.Tick
RechteckTimerTick += 1
Me.Invalidate() 'neues Paint-Ereignis anfordern
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim g As Graphics = e.Graphics
g.DrawRectangle(Stift, RechteckTimerTick, 50, 200, 100)
g.FillRectangle(Pinsel, RechteckTimerTick, 50, 200, 100)
End Sub Das Me.Invalidate führt dazu, dass ein neues Paint-Ereignis ausgelöst wird (wie gesagt bin ich mir aber nich sicher, ob das in .Net so korrekt ist, hab früher mit VB6 und danach nur mit Java gearbeitet xD). Das Paint-Ereignis wird aber nicht direkt von Invalidate() heraus aufgerufen, sondern es wird nur eine Paint-Nachricht angefordert. Der tatsächliche Aufruf des Paint-Ereignisses kann dann später erfolgen (wenn man beispielsweise die Form minimiert hat, wird es trotz Invalidate() gar nicht aufgerufen; erst sobald man sie wiederherstellt, wird ein neues Zeichnen ausgelöst).
Man kann bei Me.Invalidate() auch den Bereich eingrenzen, der tatsächlich neu gezeichnet werden soll. Vor allem bei gehr großen Zeichenflächen bringt das einen Geschwindigkeitsvorteil, da dann nicht alles komplett neu gezeichnet werden muss, sondern nur der angegebene Bereich.
Beitrag wurde zuletzt am 22.02.11 um 14:23:28 editiert. |