Picture Box mit gif transparent

  • VB.NET
  • .NET 4.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Picture Box mit gif transparent

    Hallo,

    habe eine Picture Box mit einer gif Animation. Ich würde diese als Ladestatus auf einer Form verwenden. Die angehängte gif ist ohne Hintergrund.
    Ist es möglich die Picture Box mit dem gif über Buttons so zu legen dass man nur die Zahnräder sieht ohne die eckige Struktur der Picture Box.
    Habe Frau Google gefragt aber leider konnte ich keine brauchbare Lösung finden.
    Danke.


    Bilder
    • gears.gif

      35,24 kB, 486×401, 18 mal angesehen

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

    @zoranmaric Erstell eine zweite Form mit PictureBox und der Gif als Hintergrundbild der PictureBox.
    Da siehst Du nur die Zahnräder.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @zoranmaric Die Zahnräder sind im Vordergrung.
    Form1 mit Button (Deine Form, die Du verdecken willst).
    Form2 mit PictureBox und GIF als Hintergrundbild.

    VB.NET-Quellcode

    1. Private Gears As Form2
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. If Gears Is Nothing OrElse Gears.IsDisposed Then
    4. Gears = New Form2
    5. End If
    6. If Not Gears.Visible Then
    7. Gears.Show(Me)
    8. End If
    9. 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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @zoranmaric Sorry, hab die Form2 vergessen:

    VB.NET-Quellcode

    1. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.TransparencyKey = Color.BlanchedAlmond ' irgend eine nicht vorkommendre Farbe
    3. Me.BackColor = Color.BlanchedAlmond
    4. 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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Habe in Form1, Form2 und PicBox die BackColors + Form2.TransparencyKey auf White gesetzt. Passt trotzdem.

    Hab extra noch ein dummy-Label aufs Form draufgehauen, damit der Transparenzeffekt bestätigt wird. Das Zeug im Hintergrund der App wird korrekterweise nicht angezeigt. Bei mir passt also eine Verwendung von überall-Weiß.



    Ich werf mal noch ein higher-level-Feature ein.

    Wenn dann Form1 bewegt wird, kann man das auch entsprechend korrekt darstellen lassen, indem man die WndProc modifiziert, da es wohl kein Form-Event gibt, was bei Positionsverschiebung dauerhaft gefeuert wird:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim BusyAnimation As New Form2
    3. Dim TargetWParam As IntPtr = New IntPtr(9)
    4. Private Sub BtnShowBusyAnimation_Click(sender As Object, e As EventArgs) Handles BtnShowBusyAnimation.Click
    5. BusyAnimation.Show(Me)
    6. BusyAnimation.Location = Me.Location
    7. End Sub
    8. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    9. BusyAnimation.Dispose()
    10. End Sub
    11. Protected Overrides Sub WndProc(ByRef m As Message)
    12. If m.WParam = TargetWParam Then BusyAnimation.Location = Me.Location
    13. MyBase.WndProc(m)
    14. End Sub
    15. End Class


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke euch. :)

    So passt es sehr gut:

    VB.NET-Quellcode

    1. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.CenterToParent()
    3. Me.TransparencyKey = Color.BlanchedAlmond ' irgend eine nicht vorkommendre Farbe
    4. Me.BackColor = Color.BlanchedAlmond
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. If Gears Is Nothing OrElse Gears.IsDisposed Then
    8. Gears = New Form2
    9. End If
    10. If Not Gears.Visible Then
    11. Gears.Show(Me)
    12. End If
    13. End Sub


    Habe noch ergänzt das beim bewegen der Form1 die Form2 mitwandert:

    VB.NET-Quellcode

    1. Private Sub Form1_Move(sender As Object, e As EventArgs) Handles MyBase.Move
    2. If Not (Gears Is Nothing OrElse Gears.IsDisposed) Then
    3. Gears.Location = New Point(Me.Location.X + Me.Width \ 2 - Gears.Width \ 2, Me.Location.Y + Me.Height \ 2 - Gears.Height \ 2)
    4. End If
    5. End Sub




    Das ist noch besser als move:

    VB.NET-Quellcode

    1. Dim BusyAnimation As New Form2
    2. Dim TargetWParam As IntPtr = New IntPtr(9)
    3. Private Sub BtnShowBusyAnimation_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. BusyAnimation.Show(Me)
    5. 'BusyAnimation.Location = Me.Location
    6. BusyAnimation.Location = New Point(Me.Location.X + Me.Width \ 2 - BusyAnimation.Width \ 2, Me.Location.Y + Me.Height \ 2 - BusyAnimation.Height \ 2)
    7. End Sub
    8. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    9. BusyAnimation.Dispose()
    10. End Sub
    11. Protected Overrides Sub WndProc(ByRef m As Message)
    12. 'If m.WParam = TargetWParam Then BusyAnimation.Location = Me.Location
    13. If m.WParam = TargetWParam Then BusyAnimation.Location = New Point(Me.Location.X + Me.Width \ 2 - BusyAnimation.Width \ 2, Me.Location.Y + Me.Height \ 2 - BusyAnimation.Height \ 2)
    14. MyBase.WndProc(m)
    15. End Sub


    DANKE :) :) :)

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

    Bin tatsächlich etwas verwirrt. Vor dem Austesten mit der WndProc habe ich es natürlich auch mit dem Move-EventHandler probiert, aber das feuerte erst, als ich dann das Form abgesetzt hatte. Jetzt klappt es interessanterweise. Stellen sich 2 Fragen: Warum bist Du der Meinung, dass die kompliziertere WndProc-Variante besser als die Move-EventHandler-Variante ist? Es scheint, als ob sich beide Varianten optisch gleich verhalten. Und 2.: Was ist das eigentlich für ein abgebrochenes Bild, welches in Deinen Posts auftaucht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hi "WndProc-Variante besser als die Move-EventHandler" besser oder schlechter ... habe dato immer mit move Event bei vielen Projekten gearbeitet dass ist meine erste Erfahrung mit der WndProc-Variante. Ich sehe nur das es funktioniert ohne Probleme, zumindest in diesen Beispiel.
    Das abgebrochene Bild ist nur ein Screenshot also nur als Beispiel zu den Posts. Live funktioniert alles gut.
    Danke.
    Mit einem selber gemachtem Event geht es genau so gut. Ist aber sicher eine Frage wie das Projekt aufgebaut ist und auch Geschmacksache.
    So wandert die Form1 mit Form2 mit. Auch die Resize-Funktion wird unterstützt.
    Man könnte sogar eine Using frm2 machen und mit ShowDialog die Form2 aufrufen.
    Freundliche Grüsse

    exc-jdbi
    Form1

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private WithEvents BusyAnimation As Form2
    5. Private Sub BtnShowBusyAnimation_Click(sender As Object, e As EventArgs) Handles BtnShowBusyAnimation.Click
    6. Me.BusyAnimation = New Form2(Me.Location, Me.Size)
    7. Me.BusyAnimation.Show(Me)
    8. End Sub
    9. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    10. Me.BusyAnimation.Dispose()
    11. End Sub
    12. Private Sub BusyAnimation_FollowForms(sender As Object, e As EventArgs) Handles BusyAnimation.FollowForms
    13. If TypeOf sender Is Form2 Then
    14. Me.Size = DirectCast(sender, Form2).Size
    15. Me.Location = DirectCast(sender, Form2).Location
    16. End If
    17. End Sub
    18. Public Sub New()
    19. MyBase.New
    20. Me.InitializeComponent()
    21. End Sub
    22. End Class

    Form2

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form2
    4. Private StartFlag As Boolean = False
    5. Public Event FollowForms As EventHandler(Of EventArgs)
    6. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.CenterToParent()
    8. Me.TransparencyKey = Color.BlanchedAlmond
    9. Me.BackColor = Color.BlanchedAlmond
    10. Me.PictureBox1.Image = My.Resources.gears
    11. End Sub
    12. Private Sub BtnStopAnimation_Click(sender As Object, e As EventArgs) Handles BtnStopAnimation.Click
    13. Me.Close()
    14. End Sub
    15. Private Sub Form2_Move(sender As Object, e As EventArgs) Handles MyBase.Move
    16. If Me.StartFlag Then
    17. RaiseEvent FollowForms(sender, New EventArgs)
    18. End If
    19. End Sub
    20. Private Sub Form2_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    21. If Me.StartFlag Then
    22. RaiseEvent FollowForms(sender, New EventArgs)
    23. End If
    24. End Sub
    25. Private Sub New()
    26. MyBase.New()
    27. Me.InitializeComponent()
    28. 'Me.StartPosition = FormStartPosition.Manual
    29. Me.StartFlag = True
    30. End Sub
    31. Public Sub New(_loc As Point, _size As Size)
    32. Me.New
    33. Me.Size = _size
    34. Me.Location = _loc
    35. End Sub
    36. End Class

    exc-jdbi schrieb:

    Man könnte sogar eine Using frm2 machen und mit ShowDialog die Form2 aufrufen.
    Nur wird da die Form1 angehalten, was nicht Sinn des ganzen ist.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Jetzt habe ich mich gefragt, ob mir etwas entgangen ist. Der TE möchte ja damit den Ladestatus anzeigen.
    Die Form2 schliesst sich dann wieder, sobald der Ladeprozess abgeschlossen ist.

    Using frm2 hat den Vorteil, dass Form1 nicht mehr erreichbar wäre, bis alles abgeschlossen ist. Das war mein Gedanke.

    Freundliche Grüsse

    exc-jdbi