Hi
Die Frage, wie man ohne Flimmern zeichnet, wurde inzwischen schon vielfach gestellt. Jetzt habe ich mich entschlossen, einen Code zu veröffentlichen, der das Problem behebt. Die nachfolgende Klasse soll nur veranschaulichen, wie die Buffered-Graphics-Klasse funktioniert und ist nicht optimal gecodet, zeigt aber auf, wie der Fehler zu Behandeln ist.
Zum Zeichnen einfach eine Instanz der Klasse erstellen und die Render-Methode aufrufen.
Eine Veranschaulichung befindet sich im Anhang.
Die BallsNormal.exe-Datei zeigt das Problem von GDI+, die BallsBuffered.exe-Datei ist mithilfe der BufferedGraphics-Klasse optimiert worden.
Gruß
~blaze~
Die Frage, wie man ohne Flimmern zeichnet, wurde inzwischen schon vielfach gestellt. Jetzt habe ich mich entschlossen, einen Code zu veröffentlichen, der das Problem behebt. Die nachfolgende Klasse soll nur veranschaulichen, wie die Buffered-Graphics-Klasse funktioniert und ist nicht optimal gecodet, zeigt aber auf, wie der Fehler zu Behandeln ist.
VB.NET-Quellcode
- Public NotInheritable Class Rendering
- Private bgcContext As BufferedGraphicsContext 'Erzeugt den buffer
- Private clrBackColor As Color = Color.Black 'Hintergrundfarbe
- Public Property BackColor() As Color
- Get
- Return clrBackColor
- End Get
- Set(ByVal value As Color)
- clrBackColor = value
- End Set
- End Property
- Public Sub Render(ByVal surface As Graphics)
- 'erzeugt das BufferedGraphics-Objekt für ein Graphics-Objekt
- Dim bg As BufferedGraphics = bgcContext.Allocate(surface, Rectangle.Round(surface.ClipBounds))
- Draw(bg)
- bg.Render()
- bg.Dispose()
- End Sub
- Public Sub Render(ByVal surface As Graphics, ByVal clipRectangle As Rectangle)
- 'erzeugt das BufferedGraphics-Objekt für ein Graphics-Objekt
- Dim bg As BufferedGraphics = bgcContext.Allocate(surface, Rectangle.Round(clipRectangle))
- Draw(bg)
- bg.Render()
- bg.Dispose()
- End Sub
- Public Sub Render(ByVal deviceContext As IDeviceContext, ByVal clipRectangle As Rectangle)
- 'erzeugt das BufferedGraphics-Objekt für ein DeviceContext-Objekt
- Dim bg As BufferedGraphics = bgcContext.Allocate(deviceContext.GetHdc, clipRectangle)
- Draw(bg)
- bg.Render()
- bg.Dispose()
- deviceContext.ReleaseHdc()
- End Sub
- Private Sub Draw(ByVal bufferedSurface As BufferedGraphics)
- With bufferedSurface.Graphics
- 'zeichnen
- .Clear(clrBackColor)
- .FillEllipse(Brushes.Blue, 100, 100, 10, 10)
- End With
- End Sub
- Public Sub New()
- bgcContext = BufferedGraphicsManager.Current
- End Sub
- Public Sub New(ByVal context As BufferedGraphicsContext)
- bgcContext = context
- End Sub
- End Class
Zum Zeichnen einfach eine Instanz der Klasse erstellen und die Render-Methode aufrufen.
Eine Veranschaulichung befindet sich im Anhang.
Die BallsNormal.exe-Datei zeigt das Problem von GDI+, die BallsBuffered.exe-Datei ist mithilfe der BufferedGraphics-Klasse optimiert worden.
Gruß
~blaze~
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ () aus folgendem Grund: Rechtschreibung ausgebessert; Negative Formulierung ausgebessert; Release()-Aufruf bei der Render(IDeviceContext, Rectangle)-Prozedur