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?
transparenz und bild
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.
-
-
-
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
- Public Class UserControl1
- Dim o As Point
- Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
- If e.Button = Windows.Forms.MouseButtons.Left Then
- o = e.Location 'hier wird die mouseloc herausgefunden
- Invalidate()
- End If
- MyBase.OnMouseMove(e)
- End Sub
- Protected Overrides Sub OnParentBackgroundImageChanged(ByVal e As System.EventArgs)
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- Using B As New Bitmap(Width, Height)
- Using G = Graphics.FromImage(B)
- G.Clear(BackColor)
- 'G.DrawImage(My.Resources.Bar3, 0, CInt(Height / 2), Width, CInt(Height / 2)) war von einem anderen test also unwichtig
- G.DrawImage(My.Resources.Bar3, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
- 'G.DrawImage(My.Resources.Bar_1, o.X - CInt((10 / 2)), 0, 10, Height) das gleiche wie oben
- G.DrawImage(My.Resources.schieber_1_png, 0, o.Y - CInt(10 / 2), 20, 28) 'hier wird das teil zum scrollen gezeichnet
- e.Graphics.DrawImage(B.Clone, 0, 0)
- End Using
- End Using
- End Sub
- End Class
Edit by ~blaze~:
Beiträge zusammengefügt.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).
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
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thefiloe“ ()
-
Einfach
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 verschiebenDieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()
-
Noch die Style-Flags setzen (beim Erzeugen des Controls).
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
- Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
- e.Graphics.DrawImage(My.Resources.Bar3, validBounds) 'hier wird der hintergrund gezeichnet
- 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~“ ()
-
-
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()
-
-
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
- Public Class Bar
- Dim o As Point
- Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Dim intMaximum As Integer = ClientSize.Height
- Dim intMinimum As Integer = 0
- Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
- o.Y = ((Math.Max(Math.Min(e.Y, validBounds.Bottom), validBounds.Top) - validBounds.Top) / validBounds.Height) * (intMaximum - intMinimum) + intMinimum
- Invalidate()
- End If
- MyBase.OnMouseMove(e)
- End Sub
- Protected Overrides Sub OnCreateControl()
- MyBase.OnCreateControl()
- MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
- End Sub
- Protected Overrides Sub OnParentBackgroundImageChanged(ByVal e As System.EventArgs)
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- Dim validBounds As New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
- e.Graphics.DrawImage(My.Resources.bar, validBounds) 'hier wird der hintergrund gezeichnet
- 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
- 'e.Graphics.DrawImage(My.Resources.bar1_1, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
- '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
- End Sub
- End Class
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()
-
VB.NET-Quellcode
- Private btValue As Byte
- Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Dim validBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
- btValue = CByte(((Math.Max(Math.Min(e.Y, validBounds.Bottom), validBounds.Top) - validBounds.Top) / validBounds.Height) * 255)
- Invalidate()
- End If
- MyBase.OnMouseMove(e)
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- Dim validBounds As New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
- e.Graphics.DrawImage(My.Resources.bar, validBounds) 'hier wird der hintergrund gezeichnet
- 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
- 'e.Graphics.DrawImage(My.Resources.bar1_1, 0, 0, Me.Width, Me.Height) 'hier wird der hintergrund gezeichnet
- '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
- 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
doch leider ist das schwerer als gedacht das hilft mir mal nich groß weiter
link
vll wer ne ide?Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thefiloe“ ()
-
Einfach ein Event deklarieren:
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
- Private btValue As Byte
- Private rctBarBounds As Rectangle
- Protected Overridable Sub OnValueChanged(ByVal e As EventArgs)
- Me.Refresh()
- RaiseEvent ValueChanged(Me, e)
- End Sub
- Public Overridable Property Value() As Byte
- Get
- Return btValue
- End Get
- Set(ByVal value As Byte)
- btValue = value
- OnValueChanged(New EventArgs())
- End Set
- End Property
- Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
- MyBase.OnSizeChanged(Me, e)
- rctBarBounds = New Rectangle(0, 15, Me.ClientSize.Width, Me.ClientSize.Height - 35)
- End Sub
- Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Dim rctBarBounds As New Rectangle(0, 5, Me.ClientSize.Width, Me.ClientSize.Height - 10)
- Value = CByte(((Math.Max(Math.Min(e.Y, rctBarBounds.Bottom), rctBarBounds.Top) - rctBarBounds.Top) / rctBarBounds.Height) * 255)
- End If
- MyBase.OnMouseMove(e)
- End Sub
- Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Value = CByte(((Math.Max(Math.Min(e.Y, rctBarBounds.Bottom), rctBarBounds.Top) - rctBarBounds.Top) / rctBarBounds.Height) * 255)
- End If
- MyBase.OnMouseDown(e)
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- e.Graphics.DrawImage(My.Resources.bar, rctBarBounds) 'hier wird der hintergrund gezeichnet
- 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
- End Sub
Gruß
~blaze~
-
Ähnliche Themen