GDI Invalidate(Rectangle) unperformant

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    GDI Invalidate(Rectangle) unperformant

    Guten Abend,

    ich habe folgendes Problem:
    ich hatte vor, ein Menü mit Mouseover Buttons mit GDI zu machen.

    Dies funktioniert mit folgendem Code:

    VB.NET-Quellcode

    1. Private Sub FormGame_MouseHover(sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    2. If btnMenuStart.Contains(e.Location) Then
    3. BG_BtnStart = New SolidBrush(Color.FromArgb(100, 200, 204, 0))
    4. Invalidate(btnMenuStart)
    5. Update()
    6. Else
    7. BG_BtnStart = New SolidBrush(Color.FromArgb(50, 200, 204, 0))
    8. Invalidate(btnMenuStart)
    9. Update()
    10. End If
    11. End Sub


    Solange ich kein BackgroundImage festgelegt habe, funktioniert alles und die CPU Auslastung ist auch nicht unbedingt hoch.
    Wenn ich jedoch ein BackgroundImage festlege, liegt die CPU Auslastung bei 25%. Ich weiß nicht warum, ich zeichne doch nur den Bereich des btnMenuStart neu, oder? (ist ein Rectangle)

    Im PaintEvent wird das Rectangle dann nur neu befüllt mit der neuen Farbe.

    Bin für jede Hilfe dankbar,
    Oliver
    Es werden zwar nur Pixel im angegebenen Bereich gesetzt, es müssen aber ja trotzdem alle Befehle im Paint-Event ausgeführt werden. Das ist immer noch performanter als alles neu zu zeichnen, jedoch nicht optimal. Du solltest besser ein eigenes Control schreiben, das dann auch seinen eigenen Zeichenbereich besitzt. Das ist performant und OOP-konform.
    Wenn Du weißt, welcher Bereich neu zu zeichnen ist, kannst Du den zu invalidisierenden Bereich gezielt auf ein Minimum reduzieren durch mehrere Invalidate()-Befehle, oder Du invalidisierst eine Region.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!