User Passwort
 Passwort speichern Passwort vergessen?
 
 
 
 Alle Foren
 PDA-Dev :: Windows Mobile
 Windows Mobile - Allgemeines
 Auf Control zeichnen - Caching/Buffering
Autor Vorheriges Thema Thema Nächstes Thema  

pda-dev

pda-dev

Forum Admin


554 Beiträge

Erstellt am: 06.02.2009 :  17:19:32 Uhr  Profil anzeigen  Autor eine Email senden  Besuche pda-dev's Homepage  Sende pda-dev eine ICQ Message  Antwort mit Zitat
In vielen Situationen ist es erforderlich, direkt auf einem Steuerelement (z.B. einem Panel) zu "zeichnen", um eigene Tabellen o.ä. zu erstellen.
Dieser kurze Tipp zeigt, wie sich in vielen Fällen die Performance solcher selbstgezeichneter Steuerelemente erheblich verbessern lässt.
Normalerweise wird zum Erstellen der Oberfläche das Paint-Event verwendet, da es (beim .NET Compact Framework) nur so möglich ist, ein Graphics-Objekt zu erhalten, auf das dann Linien, Rectangles etc. gezeichnet werden können.
Dabei gilt es aber zu bedenken, dass das Paint-Ereignis sehr oft auftritt, natürlich beim Erstellen des Steuerlements, aber auch beim Scrollen oder wenn ein darüberliegendes Steuerlement aktiviert wird.
Hat man nun im Paint-Eventhandler schön seine Berechnungen und Zeichenfunktionen untergebacht (und natürlich extra resourcenschonend programmiert! ), wundert man sich schnell, warum die Oberfläche dennoch so träge wirkt und immer wieder flackert.
Es gibt aber eine Lösung: der grundlegend bessere Ansatz ist es, seine "Zeichnung" nicht direkt auf das Steuerelement zu setzen, sondern zunächst in ein Bitmap, einen sog. Buffer, zu zeichen, welches die selben Dimensionen hat, wie das zu befüllende Steuerlement.
Nun reicht es aus, das Bitmap als Membervariable anzulegen, es ein mal zu zeichnen und dann einfach bei jedem Paint-Event auf das Steuerlement zu setzen.
Der erforderliche Code sieht grob so aus (VB.NET):
 
Public Class myForm Inherits Form
'Buffer-Bitmap als Member-Variable
private bmpBuffer as Bitmap = Nothing
'In dieser Methode wird das Bitmap erstellt und "befüllt"
'Die Methode kann an beliebiger Stelle aufgerufen werden, z.B. in New()
'oder aber auch im Paint-Eventhandler (s.u.), wenn bmpBuffer noch Nothing ist
Public Sub DrawBitmap()
'Wichtig: falls schon Buffer vorhanden, den Speicher erst wieder freigeben
If Not bmpBuffer Is Nothing Then
bmpBuffer .Dispose()
bmpBuffer = Nothing
End If
'Bitmap mit entsprechenden Dimensionen erstellen und Graphics Objekt erhalten
bmpBuffer = New Bitmap(targetComponent.Width, targetComponent.Height)
Dim g As Graphics = System.Drawing.Graphics.FromImage(bmp)
'hier alle Mölichen Sachen mit dem Graphics Objekt anstellen
End Sub
'Das ist die eigentliche Paint-Ereignisbehandlung
Private Sub my_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
Handles targetComponent.Paint
Dim g As Graphics = e.Graphics
'hier das Bitmap aufs Control zeichnen
If Not bmpBuffer Is Nothing Then
g.DrawImage(bmpBuffer, 0, 0)
End If
End Sub
'WICHTIG! Beim Zerstören des Formulars muss das Bitmap auch explizit entfernt werden
' da sonst bei mehrfachem Instanziieren des Formulars immer zusätzlicher Speicher belegt wird
'was bald in einer OutOfMemoryException enden würde
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If Not bmpBuffer Is Nothing Then
bmpBuffer.Dispose()
bmpBuffer = Nothing
End If
MyBase.Dispose(disposing)
End Sub
End Class
 

Ein Computer wird nie das tun, was du willst - sondern das, was du programmierst!
   
  Vorheriges Thema Thema Nächstes Thema  
Springe nach:
 
  Bookmark & Share  
 
 
 
  Tags  
   
 
 



pda-dev.de

Quicklinks: Foren-Übersicht | Developer-News | Suche | Impressum

© just-works! Software

Zum Anfang der Seite

Snitz Forums 2000