Probleme mit Controls durch Farbverlauf

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Confuzi Us.

    Probleme mit Controls durch Farbverlauf

    Hallo,

    neulich wurde ich gefragt ob man nicht einfach mal ein Farbverlauf von weiß zu grau (von oben nach unten) machen könnte.
    Ich habe gesagt das dies kein Problem sei, hatte nach 5 Minuten klimpern auch alles soweit fertig.

    Alles funktioniert, alles Top!

    Nur sieht es nun richtig mies aus,
    wie man im Anhang sehen kann..

    Was für Einstellungen muss ich machen bei den Eigenschaften der Controls?
    (BackColor hab ich auch schon geändert, einmal auf Transparent ohne Ergebnis)

    Grüße,
    Confuzi Us
    Bilder
    • VB bild.png

      1,44 kB, 95×71, 553 mal angesehen
    Auf was für einem Container sind die Controls denn angeordnet? Möglicherweise ist es vor dem ändern der BackColor auf Transparent auch noch erforderlich das Parent des Controls auf den Container zu setzen, damit dieser als Hintergrund für das Control genommen wird. Oder liegen die Controls einfach frei auf der Form?
    Liegen frei auf der Form-
    ist das Grundsätzlich falsch? - So nebenbei?

    Normalerweise waren meine Programme so das man nur ein Knopf drücken musste und das war's auch schon, bzw. das Programm starten und "gudd is".
    Also ich bin totaler "Formleglegastheniker"..
    So, denke dass dieses Bild etwas ausdrucksvoller ist! :D

    Also "funktionieren" im Sinne: "Super, er macht den Farbverlauf wie gewollt"

    Nur mache ich ja anscheinend einen Fehler bei den Controls. ?(
    Bilder
    • Bild 1.png

      4,65 kB, 232×858, 207 mal angesehen
    Kannst Du die Hintergrundfarbe der Controls auf Durchsichtig setzen?
    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!
    Meinst du die "Farbe" Transparent?
    Schon gemacht, kein Ergebnis.

    Ich habe den controls auch schon mal eine Farbe zugewiesen und diese dem Transparency-Key zugeordnet.

    Ergebnis war das mein Farbverlauf wie gewünscht war
    und die Controls einen schwarzen Text hatten und deren BackColor durchsichtig war ^^

    Confuzi Us schrieb:

    Ergebnis war das mein Farbverlauf wie gewünscht war
    Ja wie soll es denn sein?
    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!
    @Confuzi Us: Setze die BackColor-Eigenschaft der Labels auf Color.Transparent. Das funktioniert bei mir einwandfrei.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner: Hatten wir gerade:

    Confuzi Us schrieb:

    Meinst du die "Farbe" Transparent?
    Schon gemacht, kein Ergebnis.
    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!
    @RodFromGermany
    Genau, wie @Telcrome schon sagt, möchte ich einfach die "Control"-Farbe weg haben, und mein Hintergrundfarbverlauf beibehalten.

    ...Aber vielleicht mach ich auch einfach einen Fehler bei meiner Geschichte?

    VB.NET-Quellcode

    1. Private Sub BackColorZeichnen(ByVal FarbeVonOben As Color, ByVal FarbeNachUnten As Color)
    2. Dim objPinsel As New Drawing2D.LinearGradientBrush(Me.DisplayRectangle, FarbeVonOben, FarbeNachUnten, Drawing2D.LinearGradientMode.Vertical)
    3. Dim objGrafik As Graphics = Me.CreateGraphics()
    4. objGrafik.FillRectangle(objPinsel, Me.DisplayRectangle)
    5. objPinsel.Dispose()
    6. objGrafik.Dispose()
    7. End Sub


    Die Sub wird in dem "Form1_Paint" aufgerufen.

    Ich habe echt gar keine Ahnung von GDI+ und WPF...
    Vor allem, wann benutze ich was?

    Aber das hat mich nun gefesselt und ich möchte das unbedingt hinbekommen,
    und so schwer kann das nicht sein, behaupte ich mal. Ich denke ich hab da einen kleinen Wurm in meiner Sub?
    Vielleicht?

    Liegt es daran das ich die Form (den Inhalt) jedes mal neu Zeichne, wenn ich die Form ziehe?

    @Artentus
    Wieso ist es möglich meinem Label1 die BackColor Eigenschaft "transparent" zuzuweisen,
    die Form grün mache, und mein Label dann die Farbe der form "übernimmt"?
    -Und genau deswegen denke ich, liegt es an meinem "zeichnen".. ?(

    Vielen Dank!
    Hallo,

    so macht man die Hintergünde tatsächlich Transparent:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    3. Dim r As New Rectangle(0, 0, Me.Width, Me.Height)
    4. Dim b As New System.Drawing.Drawing2D.LinearGradientBrush(r, Color.Black, Color.Gray, System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal)
    5. e.Graphics.FillRectangle(b, r)
    6. End Sub
    7. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    8. For Each lbl In Me.Controls.OfType(Of Label)()
    9. lbl.BackColor = Color.FromArgb(0, 0, 0, 0)
    10. Next
    11. End Sub
    12. End Class


    mfG

    Derfuhr
    Bilder
    • lbl.jpg

      46,56 kB, 649×289, 179 mal angesehen
    @Artentus
    Okay, habe ich nun verstanden. ^^

    @Derfuhr
    Okaaay... Vielen Dank :)

    C&P Probleme: Vom verstehen her..
    Wie sieht das nun bei For Each aus?
    Theoretisch sollten nun alle Labels den Farbwert (0,0,0,0) haben?

    C&P -> labels sind noch grau (control) hinterlegt
    Werde heute leider nicht mehr dazu kommen..
    Ich denke ich werd mal die Form komplett neu anlegen..

    Vielleicht ist auch einfach nur ein Fehler in dem Designer drin? (!)

    Mal schauen..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Confuzi Us“ ()

    @RodFromGermany: Vorausgesetzt natürlich, er zeichnet im Paint-EventHandler.

    @Artentus: Solange man keine Animationen laufen hat, funktioniert Transparenz einwandfrei. Siehe DesktopPinner in meiner Signatur. Da sind alle Controls bis auf das hinterste, in dem auch die Animation gezeichnet wird (und die Buttons), transparent. In der Bug-Liste findet man auch das einzige Problem damit: die Animation wird an den Übergängen zwischen Controls etwas verschoben.
    Also wie gesagt: Solange es keine Animation ist, läuft's relativ gut.

    @Confuzi Us:
    Wie Derfuhr schon gezeigt hat, solltest Du im Paint-Event den Farbverlauf zeichnen. Allerdings gibt's noch Verbesserungsmöglichkeiten:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    2. Using B As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, Me.ClientRectangle.Height), Color.LightGray, Color.Gray)
    3. e.Graphics.FillRectangle(B, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height)
    4. End Using
    5. MyBase.OnPaint(e)
    6. End Sub
    Me.ClientRectangle gibt das Rechteck der Form ohne den Rand an.

    Durch das Verwenden von Using wird der SolidBrush gleich nach dem Verwenden wieder verworfen, was nötig ist, um die Ressourcen wieder freizugeben.

    Was noch fehlt ist das Invalidieren der Form, wenn sich die Größe ändert (Aufruf an Me.Invalidate()), damit der Hintergrund komplett neu gezeichnet wird.

    Alternativ kannst Du den Brush global deklarieren:

    VB.NET-Quellcode

    1. Dim B As Drawing2D.LinearGradientBrush
    2. Private Sub ResetBrush()
    3. If Not B Is Nothing Then
    4. B.Dispose()
    5. End If
    6. B = New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, Me.ClientRectangle.Height), Color.LightGray, Color.Gray)
    7. End Sub
    8. Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    9. e.Graphics.FillRectangle(B, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height)
    10. MyBase.OnPaint(e)
    11. End Sub
    Zusätzlich zu Me.Invalidate() muss ResetBrush() aufgerufen werden, wenn sich die Größe der Form ändert.

    Das funktioniert sogar problemlos mit verschachtelten Controls. Voraussetzung ist halt eben, dass die BackColor-Eigenschaft aller Controls (auch von beispielsweise Panels) auf Transparent ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils