Warum Button-Grafik mit GDI+ statt mit Image

  • Allgemein

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von MAANTECH.

    Warum Button-Grafik mit GDI+ statt mit Image

    Hallo com,

    Da ich ja momentan an dem Playbutton arbeite wollte ich mal wissen, warum es besser ist, wenn ich die Grafik mit GDI+ zeichne, als wenn ich einfach ein Bild lade?

    mfg MAANtech
    ...weil das Bild auch nur per GDI dargestellt wird. GDI ist sozusagen das Grafik-Backend für Windows Forms.

    genau und ich glaube - was meiner Meinung nach nicht so verständlich rübbergekommen ist(nicht böse sein ;) ) - wollte er sagen, dass kein zusätzliches Control benötigt wird, welches in den Speicher geladen und erstellt/verwaltet werden muss, außerdem kannst du bei GDI+ das Doublebuffering viel leichter einstellund und programmieren, dass es wirklich nicht flackert ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    dass kein zusätzliches Control benötigt wird

    Für das Bild alleine braucht er kein eigenes - da reicht die PictureBox. Wenns aber ein Play-Button mit allen Schikanen inkl. Hover-Effekt & Co. sein soll, würde ich das schon in ein Extracontrol schreiben. Ich hab sowas mal für Windows Mobile erstellt - das ist in GDI aufwändig, aber machbar und nicht allzu unperformant.
    Gruß
    hal2000
    Ich habe alle erdenklichen Möglichkeiten in meinem UserControl ausprobiert, keine einzige funktioniert, es flackert beim Ändern des SelectedIndex (das Control ist ne geänderte ListBox), beim Vergrößern/Verkleinern, etc...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    So ich zeig euch einfach mal meinen Code ;) Dürft ihn auch verwenden wenn ihr wollt.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <DefaultEvent("Click")> Public Class PlayButton
    3. Private Sub Grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
    4. Dim graphPath As New Drawing2D.GraphicsPath()
    5. graphPath.AddEllipse(ClientRectangle)
    6. Region = New Region(graphPath)
    7. End Sub
    8. Private Sub Laden(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    9. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.SupportsTransparentBackColor Or ControlStyles.ResizeRedraw, True)
    10. Me.BackColor = Color.Transparent
    11. BackgroundImage = My.Resources.Play
    12. BackgroundImageLayout = ImageLayout.Stretch
    13. End Sub
    14. <EditorBrowsable(EditorBrowsableState.Never)> <Browsable(False)> Public Overrides Property BackColor As Color
    15. Get
    16. Return MyBase.BackColor
    17. End Get
    18. Set(ByVal value As System.Drawing.Color)
    19. MyBase.BackColor = value
    20. End Set
    21. End Property
    22. <EditorBrowsable(EditorBrowsableState.Never)> <Browsable(False)> Public Overrides Property BackgroundImage As System.Drawing.Image
    23. Get
    24. Return MyBase.BackgroundImage
    25. End Get
    26. Set(ByVal value As System.Drawing.Image)
    27. MyBase.BackgroundImage = value
    28. End Set
    29. End Property
    30. Private Sub UserControl1_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
    31. BackgroundImage = My.Resources.Play_hover
    32. End Sub
    33. Private Sub UserControl1_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    34. BackgroundImage = My.Resources.Play
    35. End Sub
    36. Private Sub UserControl1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    37. BackgroundImage = My.Resources.Play_pressed
    38. End Sub
    39. Private Sub UserControl1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
    40. BackgroundImage = My.Resources.Play_hover
    41. End Sub
    42. End Class


    Was haltet ihr von dem Code? Was würdet ihr besser anders machen? Ich dachte auch daran, dass man später eigene Styles machen kann; also einfach ein Programm, dass sämtliche Images für sämtliche Buttons in eine dll einkompiliert und das Button Modul sich die entsprechenden Grafiken einfach aussucht, so kann jeder Nutzer dann sein eigenes Design fürs fertige Programm machen.

    mfg MAANtech
    Ich gehöre zu denen die sie gut finden ^^

    Zu dem dubble buffering nochmal: Ich habe gestern ein Control gemacht in dem ich auch mit gdi+ auf das Usercontroll zeichne. wenn du bei den eigenschaften des usercontrolls mal rechts im eigenschaften fenster guckts findest du da natürlich neben size etc. auch den eintrag "DoubleBufferd" wenn du das auf true stellst flackert da nichts mehr. auch nicht bei flüssigen hover effeckten.