PictureBox auf PictureBox Transparent machen..?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    PictureBox auf PictureBox Transparent machen..?

    Hallo Forum,

    ich denke dieses Thema wurde schon oftmals durchgekaut, allerdings stehe ich gerade auf dem Schlauch.


    Ich habe ein PictureBox Control (picBox1) und auf dieser befindet sich eine 2. (picBox2)
    Die erste ist 200x200 groß und die 2. 30x30 groß. Die zweite befindet sich oben rechts auf picBox1 und soll einen Haken für "Vorhanden" oder ein Kreuz für "Nicht vorhanden" darstellen. ~ Das ist kein Problem.
    Allerdings übernimmt picBox2 nicht die Einstellung BackColor = Transparent. Übrigens lade ich eine PNG Datei rein.
    Befindet sich picBox2 auf der Form ist das alles kein Problem.

    Ich habe auch schon mit

    VB.NET-Quellcode

    1. picBox2.Parent = Me
    versucht die Box von der Form zu erstellen bzw. erben zu lassen, macht mein Programm ja, allerdings dann auch "unter" picBox1 :D :S

    Habt ihr eine Idee woran es liegen kann? Habe ich etwas vergessen?

    Danke und Grüße :rolleyes:
    Option Strict On!

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

    Drahuverar schrieb:

    eine 2. (picBox2)
    Suboptimal.
    Schmeiß die zweite PictureBox raus und male im Paint-Event der ersten das kleine Bild dahin, wo es hin soll mit Graphics.DrawImage().
    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

    Okay. Heißt ich muss das bild nehmen und übermalen.
    Das ist kein Problem.

    Aaaber... Wenn ich nun mein Bild in der PictureBox nehme und "übermale" ... und anschließend wieder übermale.. dann überlappt sich das ja.. Weiß nicht wie ich das... am besten realisieren kann.. ;(

    VB.NET-Quellcode

    1. Private Sub DrawMyImage(ByRef PicBox As PictureBox, ByRef Available As Boolean)
    2. Dim imgAvailable As Image = My.Resources.Available
    3. Dim imgNotAvailable As Image = My.Resources.NotAvailable
    4. Dim g As Graphics = Graphics.FromImage(PicBox.Image) 'Problemzone
    5. Select Case Available
    6. Case True
    7. g.DrawImage(imgAvailable, New Rectangle(0, 0, 200, 200))
    8. Case False
    9. g.DrawImage(imgNotAvailable, New Rectangle(0, 0, 200, 200))
    10. End Select
    11. PicBox.Refresh()
    12. End Sub


    Wollte mir eine kleine Methode schreiben, damit mein Code etwas sauberer aussieht.
    Die Problemzone ist mir bekannt. Ich habe auch schon versucht, nachdem ich den Inhalt der picBox1 verändert habe, diesen als graphic zwischenzuspeichern.. aber irgendwie und irgendwo mach ich einen Fehler. Wie geht man da vor? (Mache so selten was mit GDI)

    Danke Dir
    Option Strict On!

    Drahuverar schrieb:

    realisieren

    RodFromGermany schrieb:

    im Paint-Event
    der ersten PictureBox:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    2. If Available Then
    3. e.Graphics.DrawImage(My.Resources.Available, New Rectangle(0, 0, 200, 200))
    4. Else
    5. e.Graphics.DrawImage(My.Resources.NotAvailable, New Rectangle(0, 0, 200, 200))
    6. End If
    7. End Sub

    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!
    @ChOoSeMyNaMe
    ...Nunja.. es funktioniert ja. Ich will es ja in einem gewissen Event abfeuern, deswegen die Methode. Da ich das Paint Event ja nicht wirklich auslöse an dieser Stelle (sondern 3 Schritte vorher, so zusagen)
    Was ist an Invalidate besser und wann sollte ich Invalidate nutzen?

    @RodFromGermany
    Ich hab mal ein kleines Projekt angehangen. Mein Weg würde nur funktionieren wenn ich jedesmal auf's neue die Resource hinterlege.
    Würde ich also überprüfen ob vorhanden dann klappt es, aber sollte im nachhinein etwas nicht vorhanden sein, dann übermalt mein Programm das.

    Ich bin der Meinung das, dass Paint Event nicht wirklich klappt~
    vielleicht bin ich aber gerade ziemlich festgefahren.. Ansonsten mach ich mal 'ne kleine Denkpause und geh an etwas anderes ran...
    Dateien
    Option Strict On!

    Drahuverar schrieb:

    nicht wirklich klappt
    Lesen bildet. X(
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Available As Boolean = False
    3. 'Bildchen auswählen
    4. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    5. Select Case ComboBox1.SelectedIndex
    6. Case 0
    7. PictureBox1.Image = My.Resources.Folder
    8. Case 1
    9. PictureBox1.Image = My.Resources.Chain
    10. Case 2
    11. PictureBox1.Image = My.Resources.Grid
    12. End Select
    13. End Sub
    14. Private Sub btn_Available_Click(sender As Object, e As EventArgs) Handles btn_Available.Click
    15. Available = True
    16. PictureBox1.Invalidate()
    17. End Sub
    18. Private Sub btn_NotAvailable_Click(sender As Object, e As EventArgs) Handles btn_NotAvailable.Click
    19. Available = False
    20. PictureBox1.Invalidate()
    21. End Sub
    22. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    23. ComboBox1.SelectedIndex = 0
    24. End Sub
    25. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    26. Dim imgAvailable As Image = My.Resources.Available
    27. Dim imgNotAvailable As Image = My.Resources.NotAvailable
    28. Select Case Available
    29. Case True
    30. e.Graphics.DrawImage(imgAvailable, New Rectangle(0, 0, 30, 30))
    31. Case False
    32. e.Graphics.DrawImage(imgNotAvailable, New Rectangle(0, 0, 30, 30))
    33. End Select
    34. End Sub
    35. 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!
    @RodFromGermany
    Jouuu.. Das ist nicht böse gemeint X/
    Was mich dabei stört ist, dass nun von Anfang an schon etwas gezeichnet worden ist, ich habe das, was du mir vorgeschlagen hast, ja getestet.
    Deswegen meine aussage:

    Drahuverar schrieb:

    nicht wirklich klappt


    Muss dann halt ein paar Sachen umstrukturieren, wenn es halt so ist. (Ich meine es wirklich nicht böse) Ich mache wohl ein bild von einem Pixel rein (unscheinbar) und dem entsprechend feuer ich das Paint - Event ab..Wüsste nicht wie ich es anders machen soll...

    EDIT: Jetzt weiß ich auch weswegen ich die Methode Invalidate aufrufen soll..
    Macht nun für mich mehr Sinn.


    Danke euch!
    Option Strict On!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Drahuverar“ ()

    Du legst einfach ne Boolean an, die dann am Anfang des Paint-Events steht bspw

    VB.NET-Quellcode

    1. Dim drawit as Boolean = false
    2. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    3. If not drawit then return
    4. //restlicher code
    5. End Sub


    Nur so als Beispiel

    LG

    ChOoSeMyNaMe schrieb:

    Du legst einfach ne Boolean an,

    @Drahuverar Mit solch Flags oder geeigneten Enumbern kannst Du die komplette Darstellung steuern.
    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!