Rechteck Halbtransparent

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von gitarre94.

    Rechteck Halbtransparent

    Hallo,
    ich möchte in meiner Form ein halbtransparentes Rechteck einfügen. Ich habe dazu auch schon eine Code im Internet gefunden. Allerdings weiss ich nicht wie und wo ich den Code einfügen soll.
    Hier die Anleitung/Code: janelo.net/index.php?nav=1021

    Der Code besteht aus 4 Teile

    1. Teil

    VB.NET-Quellcode

    1. Public Class OverlayPanel
    2. Inherits Windows.Forms.Panel
    3. Public Property Opacity as Double
    4. Private imageCache As Drawing.Image = Nothing
    5. End Class


    2. Teil

    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    2. Me.PaintParentBackground(e)
    3. MyBase.OnPaint(e)
    4. End Sub


    3.Teil

    VB.NET-Quellcode

    1. Private Sub PaintParentBackground(ByVal e As PaintEventArgs)
    2. If Me.Width > 0 And Me.Height > 0 Then
    3. If IsNothing(imageCache) Then
    4. Me.Visible = False
    5. Me.imageCache = New Bitmap(Me.Parent.Width, Me.Parent.Height)
    6. Me.Parent.DrawToBitmap(Me.imageCache, New Rectangle(New Point(0, 0), Me.Parent.Size))
    7. Me.Visible = True
    8. End If
    9. Dim offsetX As Int32 = (Me.Parent.Width - Me.Parent.ClientSize.Width) / 2
    10. Dim offsetY As Int32 = Me.Parent.Height - Me.Parent.ClientSize.Height - offsetX
    11. Dim alpha As Byte = 255
    12. If Me._Opacity < 1 Then alpha = Me._Opacity * 255
    13. e.Graphics.DrawImage(Me.imageCache,
    14. New Rectangle(New Point(0, 0), Me.Size),
    15. New Rectangle(Me.Location + New Point(offsetX, offsetY), Me.Size),
    16. GraphicsUnit.Pixel)
    17. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(alpha, Me.BackColor)),
    18. New Rectangle(New Point(0, 0), Me.Size))
    19. End If
    20. End Sub


    4. Teil

    VB.NET-Quellcode

    1. Sub New()
    2. Me.SetStyle(ControlStyles.AllPaintingInWmPaint + ControlStyles.DoubleBuffer, True)
    3. End Sub


    Bin in vorallem in Sachen Grafiken in Visual Basic blutiger Anfänger :)
    Meine Frage ist jetzt wo ich die jeweiligen Programmteile in mein Projekt einfügen soll?! Also extra neue Klasse einfügen oder in Form1 einfügen?
    @gitarre94
    1. machst Du Option Strict On
    2. Was soll wie passieren?
    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!
    @fichz
    Nachdem ich die 4 Schnipsel in meine Klasse OverlayPanel gepackt habe, flog mir so einiges um die Ohren, was ich bereinigt habe.
    Dann habe ich mir ein solch Objekt auf mein Form gezogen und mit der Property Opacity rumgespielt und sehe die Hintergrundfarbe entsprechend "verblassen".
    ======
    OK.
    Ein andersfarbenes Panel brachte die Lösung:

    @gitarre94 mit Strict On und Invalidate:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class OverlayPanel
    2. Inherits Windows.Forms.Panel
    3. Implements IDisposable
    4. Public Property Opacity As Double
    5. Get
    6. Return _Opacity
    7. End Get
    8. Set(value As Double)
    9. If _Opacity <> value Then
    10. _Opacity = value
    11. Me.Invalidate()
    12. End If
    13. End Set
    14. End Property
    15. Private _Opacity As Double
    16. Private imageCache As Bitmap = Nothing
    17. Sub New()
    18. Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer, True)
    19. End Sub
    20. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    21. Me.PaintParentBackground(e)
    22. MyBase.OnPaint(e)
    23. End Sub
    24. Private Sub PaintParentBackground(ByVal e As PaintEventArgs)
    25. If Me.Width > 0 And Me.Height > 0 Then
    26. If imageCache Is Nothing Then
    27. Me.Visible = False
    28. Me.imageCache = New Bitmap(Me.Parent.Width, Me.Parent.Height)
    29. Me.Parent.DrawToBitmap(Me.imageCache, New Rectangle(New Point(0, 0), Me.Parent.Size))
    30. Me.Visible = True
    31. End If
    32. Dim offsetX As Int32 = (Me.Parent.Width - Me.Parent.ClientSize.Width) \ 2
    33. Dim offsetY As Int32 = Me.Parent.Height - Me.Parent.ClientSize.Height - offsetX
    34. Dim alpha As Byte = 255
    35. If Me._Opacity <= 1 Then alpha = CByte(Me._Opacity * 255)
    36. e.Graphics.DrawImage(Me.imageCache,
    37. New Rectangle(New Point(0, 0), Me.Size),
    38. New Rectangle(Me.Location + New Size(offsetX, offsetY), Me.Size),
    39. GraphicsUnit.Pixel)
    40. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(alpha, Me.BackColor)),
    41. New Rectangle(New Point(0, 0), Me.Size))
    42. End If
    43. End Sub
    44. Protected Overrides Sub Finalize()
    45. If imageCache IsNot Nothing Then
    46. imageCache.Dispose()
    47. End If
    48. MyBase.Finalize()
    49. End Sub
    50. End Class

    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!
    ok vielen Dank dank!
    @RodFromGermany
    Ich hab deinen Code jetzt übernommen und das Objekt eingefügt. Allerdings verblasst das Rechteck nicht. Es bleibt auf der Farbe, die ich in .BackColer eingestellt habe. Den Wert von Opacity habe ich auch geändert allerdings verblasst das Objekt nicht. Was mache ich falsch?

    gitarre94 schrieb:

    allerdings verblasst das Objekt nicht
    Probier dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Me.OverlayPanel1.Opacity = 0
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. Me.OverlayPanel1.Opacity = 0.2
    7. End Sub
    8. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    9. Me.OverlayPanel1.Opacity = 0.4
    10. End Sub
    11. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    12. Me.OverlayPanel1.Opacity = 0.6
    13. End Sub
    14. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    15. Me.OverlayPanel1.Opacity = 0.8
    16. End Sub
    17. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    18. Me.OverlayPanel1.Opacity = 1
    19. End Sub
    20. End Class
    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!