transparenz und bild

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    transparenz und bild

    ich habe in einem usercontrol eine trackbar jedoch ist das teil zum verschieben ein bild das außen herum transparent ist wie bekomm ich das so hin, dass ich das verschieben kann und es transparent ist, muss ich da gdi verwenden? und wie kann ich das dann verschieben?
    Bilder
    • usercontrolprob.JPG

      11,35 kB, 50×242, 106 mal angesehen


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ja, GDI ist 1. Wahl.
    Mit DrawImage und der Mausposition (ggf. PointToClient) auf das Control zeichnen. Nutze das Paint-Event des Steuerelementes und Steuerelement.Invalidate().
    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    EDIT: ich mach jetzt einfach mal alles per gdi aber nicht mit dem position wie oben vorgeschlagen wurde sondern etwas anders ;)
    sorry erstmal für doppelpost aber ich muss das jetztnochmals bisschen aktuallisieren.

    also ich habe jetzt das teil so weit hinbekommen jetzt ist aber noch die frage wie schaff ich das am besten, dass das nicht über den rand hinausgeht.

    Ich dachte da an sowas wie die pos von dem teil abfragen und es darf nicht drüber hinaus nur wie?
    Ich glaube ich sitz auf der Leitung also vll könntet ihr mir einen kleinen denkansatz geben ;)

    Ach ja ich hab hier noch den source den ich bis jetzt hab falls mal jmd googelt oder hier im forum sucht:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class UserControl1
    2. Dim o As Point
    3. Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
    4. If e.Button = Windows.Forms.MouseButtons.Left Then
    5. o = e.Location 'hier wird die mouseloc herausgefunden
    6. Invalidate()
    7. End If
    8. MyBase.OnMouseMove(e)
    9. End Sub
    10. Protected Overrides Sub OnParentBackgroundImageChanged(ByVal e As System.EventArgs)
    11. End Sub
    12. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    13. MyBase.OnPaint(e)
    14. Using B As New Bitmap(Width, Height)
    15. Using G = Graphics.FromImage(B)
    16. G.Clear(BackColor)
    17. 'G.DrawImage(My.Resources.Bar3, 0, CInt(Height / 2), Width, CInt(Height / 2)) war von einem anderen test also unwichtig
    18. G.DrawImage(My.Resources.Bar3, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
    19. 'G.DrawImage(My.Resources.Bar_1, o.X - CInt((10 / 2)), 0, 10, Height) das gleiche wie oben
    20. G.DrawImage(My.Resources.schieber_1_png, 0, o.Y - CInt(10 / 2), 20, 28) 'hier wird das teil zum scrollen gezeichnet
    21. e.Graphics.DrawImage(B.Clone, 0, 0)
    22. End Using
    23. End Using
    24. End Sub
    25. End Class


    Edit by ~blaze~:
    Beiträge zusammengefügt.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Hi
    Zeichne doch nicht auf die Bitmap, sondern auf das Control! Dann mach das mit zu Byte relativen Werten, die du gleich im MouseMove-und MouseDown-Event setzt. Dabei nimmst du dann ClientSize.Height als Maximum und 0 als Minimum. Der neue Wert berechnet sich dann so (wenn der minimale Wert (bei Byte 0) intMinimum und der maximale Wert (bei Byte 255) intMaximum ist).

    Quellcode

    1. newValue = (Math.Max(Math.Min(e.Y, Me.ClientSize.Height), 0) / Me.ClientSize.Height) * (intMaximum - intMinimum) + intMinimum


    Erklärung:
    Math.Max gibt den größeren Wert der beiden übergebenen zurück. Somit wird bei Werten von Y, die kleiner als 0 sind (oberhalb des Controls) 0 zurückgegeben
    Math.Min gibt den kleineren Wert der beiden übergebenen zurück. Somit wird bei Werten von Y, die größer sind als Control.ClientSize.Height (unterhalb des Controls) Control.ClientSize.Height zurückgegeben
    Anschließend wird das Minimum vom Maximum abgezogen (bei Bytes sowieso uninteressant), um den Wert auf den Wert Maximum - Minimum zu bekommen. Dazu wird noch Minimum hinzugefügt. Damit ist die Zahl nun zwischen Minimum und Maximum.

    ClientBounds bzw. ClientSize beschreibt den Bereich, der vom Control ansteuerbar ist (v.a. bei Formen wichtig, hier nicht so)

    Den bekommenen Wert einfach in einer Byte-Variable speichern und anschließend verwenden. So kannst du eine Property einführen, die den Alphawert ausgibt und beim Zeichnen einfach wieder zurückrechnen mit

    intY = 0.003921569F * btValue * Me.ClientSize.Height

    0.003921569 = 1/255
    intY ist die Position in Y-Richtung, btValue halt der Wert als Byte.

    Gruß
    ~blaze~
    ok das ist mir jetzt aber vll ein bisschen peinlich aber ich kriegs irgendwie nicht hin das direkt auf das control zu zeichenen ich bekomm immer einen fehler


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Einfach

    VB.NET-Quellcode

    1. e.Graphics.DrawImage(My.Resources.Bar3, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
    2. e.Graphics.DrawImage(My.Resources.schieber_1_png, 0, Cint(0.003921569F * btValue * Me.ClientSize.Height) - 5, 20, 28) 'hier wird das teil zum scrollen gezeichnet


    Gruß
    ~blaze~

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

    jetzt flackert aber das ganze ding wenn ich was scrolle
    btw hab das ausprobiert was du gesagt hast ja mit dem gehts, dass er nicht mehr ganz hin und her fahren kann aber da ist noch immer das problem mit dem flackern

    und da wäre noch ein problem nähmlich siehe anhang er geht unten so rein also müsste ich das control noch ein wenig größer machen wie würdet ihr das anstellen kann man nicht auf ein control im control wie zb ne picture box zeichen weil dann könnt ich einfach ein wenig verschieben :D


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Noch die Style-Flags setzen (beim Erzeugen des Controls).

    VB.NET-Quellcode

    1. Protected Overrides Sub OnCreateControl()
    2. MyBase.OnCreateControl()
    3. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    4. End Sub


    oder so ähnlich. Hab oben noch einen kleinen Schönheitsfehler mit dem CInt() korrigiert.

    Gruß
    ~blaze~
    Mach doch statt der ClientSize und den Bounds einen eigenen möglichen Bereich. Z.B.:

    VB.NET-Quellcode

    1. Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
    2. e.Graphics.DrawImage(My.Resources.Bar3, validBounds) 'hier wird der hintergrund gezeichnet
    3. e.Graphics.DrawImage(My.Resources.schieber_1_png, CInt(validBounds.X *0.5F) - 10, Cint(0.003921569F * btValue * validBounds.Height) - 5 + validBounds.Y, 20, 28) 'hier wird das teil zum scrollen gezeichnet


    Habs jetzt noch auf der Grafik zentriert, weiß nicht ob du das willst (x:=CInt(validBounds.X * 0.5F) - 10)

    Gruß
    ~blaze~

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

    danke hast mir echt super geholfen aber eine frage noch wie schaff ich das, dass ich die systemcolor control in hex code habe?

    aber btw du hast width and height vertauscht ;D


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    ja da wäre aber noch ein problem nähmlich ich bekomms nich hin entweder ich kann weit genug hochscrollen und zu wenig weit nach unten oder umgekehrt


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „thefiloe“ ()

    Jep, das hängt damit zusammen, dass die Abmessungen nur im Draw-Bereich genommen werden, nicht aber im MouseMove bzw. MouseDown-Event. Das ginge dann so:
    newValue = ((Math.Max(Math.Min(e.Y, validBounds.Bottom), validBounds.Top) - validBounds.Top) / validBounds.Height) * (intMaximum - intMinimum) + intMinimum

    Du kannst die Gleichung noch vereinfachen, aber ich habe das jetzt so stehen gelassen. Hoffe, dass ich das jetzt richtig umgeformt habe im Kopf.

    Gruß
    ~blaze~
    ich habe mir mal die codes angeschaut und mit deiner formel wirds so langsam...
    sprich das teil bewegt sich nicht mehr mit der maus sondern immer weiter dahinter

    btw so geht das aber immernoch nicht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Bar
    2. Dim o As Point
    3. Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
    4. If e.Button = Windows.Forms.MouseButtons.Left Then
    5. Dim intMaximum As Integer = ClientSize.Height
    6. Dim intMinimum As Integer = 0
    7. Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
    8. o.Y = ((Math.Max(Math.Min(e.Y, validBounds.Bottom), validBounds.Top) - validBounds.Top) / validBounds.Height) * (intMaximum - intMinimum) + intMinimum
    9. Invalidate()
    10. End If
    11. MyBase.OnMouseMove(e)
    12. End Sub
    13. Protected Overrides Sub OnCreateControl()
    14. MyBase.OnCreateControl()
    15. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    16. End Sub
    17. Protected Overrides Sub OnParentBackgroundImageChanged(ByVal e As System.EventArgs)
    18. End Sub
    19. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    20. MyBase.OnPaint(e)
    21. Dim validBounds As New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
    22. e.Graphics.DrawImage(My.Resources.bar, validBounds) 'hier wird der hintergrund gezeichnet
    23. e.Graphics.DrawImage(My.Resources.Bar_scroll, CInt(validBounds.X * 0.5F) + 2, CInt(0.003921569F * o.Y * validBounds.Height) - 14 + validBounds.Y, 20, 28) 'hier wird das teil zum scrollen gezeichnet
    24. 'e.Graphics.DrawImage(My.Resources.bar1_1, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
    25. 'e.Graphics.DrawImage(My.Resources.Bar_scroll, 2, 0.003921569F * o.Y * Me.ClientSize.Height - 5, 20, 28) 'hier wird das teil zum scrollen gezeichnet
    26. End Sub
    27. End Class



    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    VB.NET-Quellcode

    1. Private btValue As Byte
    2. Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
    3. If e.Button = Windows.Forms.MouseButtons.Left Then
    4. Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
    5. btValue = CByte(((Math.Max(Math.Min(e.Y, validBounds.Bottom), validBounds.Top) - validBounds.Top) / validBounds.Height) * 255)
    6. Invalidate()
    7. End If
    8. MyBase.OnMouseMove(e)
    9. End Sub
    10. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    11. MyBase.OnPaint(e)
    12. Dim validBounds As New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
    13. e.Graphics.DrawImage(My.Resources.bar, validBounds) 'hier wird der hintergrund gezeichnet
    14. e.Graphics.DrawImage(My.Resources.Bar_scroll, CInt(validBounds.X * 0.5F) + 2, CInt(0.003921569F * btValue * validBounds.Height) - 14 + validBounds.Y, 20, 28) 'hier wird das teil zum scrollen gezeichnet
    15. 'e.Graphics.DrawImage(My.Resources.bar1_1, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
    16. 'e.Graphics.DrawImage(My.Resources.Bar_scroll, 2, 0.003921569F * o.Y * Me.ClientSize.Height - 5, 20, 28) 'hier wird das teil zum scrollen gezeichnet
    17. End Sub

    Effizienter wäre es, validBounds immer dann zu setzen, wenn die ClientBounds sich ändern.

    Gruß
    ~blaze~
    boar ich weiß gar nicht wie ich dir danken soll es funktioniert zwar noch ein bisschen zu langsam aber alles geht!

    jetzt muss ich das nur noch mit dem scrollevent hinbekommen das mit dem mousemove geht ja schon gut :D

    doch leider ist das schwerer als gedacht das hilft mir mal nich groß weiter

    link

    vll wer ne ide? :D


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Einfach ein Event deklarieren:

    VB.NET-Quellcode

    1. Public Event ValueChanged As EventHandler


    Dann eine überschreibbare Methode einführen, die von erbenden Controls überschrieben werden kann und diese dann aufrufen, sobald der Wert geändert wird (eventuell auch immer über die Property arbeiten)

    VB.NET-Quellcode

    1. Private btValue As Byte
    2. Private rctBarBounds As Rectangle
    3. Protected Overridable Sub OnValueChanged(ByVal e As EventArgs)
    4. Me.Refresh()
    5. RaiseEvent ValueChanged(Me, e)
    6. End Sub
    7. Public Overridable Property Value() As Byte
    8. Get
    9. Return btValue
    10. End Get
    11. Set(ByVal value As Byte)
    12. btValue = value
    13. OnValueChanged(New EventArgs())
    14. End Set
    15. End Property
    16. Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
    17. MyBase.OnSizeChanged(Me, e)
    18. rctBarBounds = New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
    19. End Sub
    20. Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
    21. If e.Button = Windows.Forms.MouseButtons.Left Then
    22. Dim rctBarBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
    23. Value = CByte(((Math.Max(Math.Min(e.Y, rctBarBounds.Bottom), rctBarBounds.Top) - rctBarBounds.Top) / rctBarBounds.Height) * 255)
    24. End If
    25. MyBase.OnMouseMove(e)
    26. End Sub
    27. Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
    28. If e.Button = Windows.Forms.MouseButtons.Left Then
    29. Value = CByte(((Math.Max(Math.Min(e.Y, rctBarBounds.Bottom), rctBarBounds.Top) - rctBarBounds.Top) / rctBarBounds.Height) * 255)
    30. End If
    31. MyBase.OnMouseDown(e)
    32. End Sub
    33. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    34. MyBase.OnPaint(e)
    35. e.Graphics.DrawImage(My.Resources.bar, rctBarBounds) 'hier wird der hintergrund gezeichnet
    36. e.Graphics.DrawImage(My.Resources.Bar_scroll, CInt(rctBarBounds.X * 0.5F) + 2, CInt(0.003921569F * Value * rctBarBounds.Height) - 14 + rctBarBounds.Y, 20, 28) 'hier wird das teil zum scrollen gezeichnet
    37. End Sub


    Gruß
    ~blaze~