Problem mit Scrollen in Usercontrol

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von sothere.

    Problem mit Scrollen in Usercontrol

    Hallöchen ihr lieben,
    ich hänge gerade an einem alten Problem von mir fest und hoffe, das ihr mir vielleicht helfen könnt.
    Ich habe ein UserControl geschrieben, das praktisch eine neue Trackbar ist. An sich funktioniert alles supi, es gibt nur beim scrollen ein Problem:
    Ich kann das scrollen ohne Probleme abfragen und kann machen, was ich damit will. Allerdings scrolle ich nicht nur in meinem UC, sondern auch in der Anwendung.
    Bedeutet: Wenn ich das ganze in dem UC-Testfenster laufen lasse und die Größe dann so einstelle, das es Scroll-Balken benötigt, dann werden auch diese gescrollt. Dabei hat bzw. sollte eigentlich nur das UC den Focus.
    An sich nicht weiter Problematisch, aber wenn ich das nun in eine Anwendung einfüge und AutoScroll benutzen muss, dann scrolle ich nun in der Anwendung und sehe die Trackbar gar nicht mehr.

    Kann man das ganze beheben? Hab ich eventuell irgendwo einen Denkfehler?
    Liebe Grüße
    sothere
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <DefaultEvent("ValueChanged")> _
    2. Public Class NikoTecTrackbar
    3. Inherits UserControl
    4. #Region "Einstellungen"
    5. Private _value As Integer
    6. <Category("TrackbarSettings")> _
    7. Public Overloads Property Value() As Integer
    8. Get
    9. Return _value
    10. End Get
    11. Set(ByVal value As Integer)
    12. _value = value
    13. If _value < _minimum Then _value = _minimum
    14. If _value > _maximum Then _value = _maximum
    15. Button.Location = New Point(0, CInt(Math.Round((Me.Height - Button.Size.Height) / GetRange() * (_maximum - _value))))
    16. Me.Invalidate()
    17. End Set
    18. End Property
    19. Private _minimum As Integer
    20. <Category("TrackbarSettings")> _
    21. Public Overloads Property Minimum() As Integer
    22. Get
    23. Return _minimum
    24. End Get
    25. Set(ByVal value As Integer)
    26. _minimum = value
    27. If _minimum < 0 Then _minimum = 0
    28. If _minimum + 1 > _maximum Then _minimum = _maximum - 1
    29. If _value < _minimum Then _value = _minimum
    30. Button.Location = New Point(0, CInt(Math.Round((Me.Height - Button.Size.Height) / GetRange() * (_maximum - _value))))
    31. Me.Invalidate()
    32. End Set
    33. End Property
    34. Private _maximum As Integer
    35. <Category("TrackbarSettings")> _
    36. Public Overloads Property Maximum() As Integer
    37. Get
    38. Return _maximum
    39. End Get
    40. Set(ByVal value As Integer)
    41. _maximum = value
    42. If _maximum < _minimum + 1 Then _maximum = _minimum + 1
    43. If _value > _maximum Then _value = _maximum
    44. Button.Location = New Point(0, CInt(Math.Round((Me.Height - Button.Size.Height) / GetRange() * (_maximum - _value))))
    45. Me.Invalidate()
    46. End Set
    47. End Property
    48. Private _largechange As Integer
    49. <Category("TrackbarSettings")> _
    50. Public Overloads Property LargeChange As Integer
    51. Get
    52. Return _largechange
    53. End Get
    54. Set(ByVal value As Integer)
    55. _largechange = value
    56. If _largechange < 1 Then
    57. _largechange = 1
    58. MsgBox("Kein gültiger Wert" + vbNewLine + ErrorToString())
    59. End If
    60. End Set
    61. End Property
    62. Private _showTicks As Boolean
    63. <Category("TrackbarSettings")> _
    64. Public Property ShowTicks() As Boolean
    65. Get
    66. Return _showTicks
    67. End Get
    68. Set(ByVal value As Boolean)
    69. _showTicks = value
    70. Me.Invalidate()
    71. End Set
    72. End Property
    73. Private _tickColor As Color
    74. <Category("TrackbarSettings")> _
    75. Public Property TickColor() As Color
    76. Get
    77. Return _tickColor
    78. End Get
    79. Set(ByVal value As Color)
    80. _tickColor = value
    81. Me.Invalidate()
    82. End Set
    83. End Property
    84. Private _tickFrequency As Integer
    85. <Category("TrackbarSettings")> _
    86. Public Overloads Property TickFrequency() As Integer
    87. Get
    88. Return _tickFrequency
    89. End Get
    90. Set(ByVal value As Integer)
    91. _tickFrequency = value
    92. If _tickFrequency < 1 Then _tickFrequency = 1
    93. Me.Invalidate()
    94. End Set
    95. End Property
    96. Private _trackLineColor As Color
    97. <Category("TrackbarSettings")> _
    98. Public Property TrackLineColor() As Color
    99. Get
    100. Return _trackLineColor
    101. End Get
    102. Set(ByVal value As Color)
    103. _trackLineColor = value
    104. Me.Invalidate()
    105. End Set
    106. End Property
    107. <Category("TrackbarSettings")> _
    108. Public Property TrackButtonForeColor() As Color
    109. Get
    110. Return Button.TrackButtonForeColor
    111. End Get
    112. Set(ByVal value As Color)
    113. Button.TrackButtonForeColor = value
    114. Me.Invalidate()
    115. End Set
    116. End Property
    117. <Category("TrackbarSettings")> _
    118. Public Property TrackButtonBackColor() As Color
    119. Get
    120. Return Button.TrackButtonBackColor
    121. End Get
    122. Set(ByVal value As Color)
    123. Button.TrackButtonBackColor = value
    124. Me.Invalidate()
    125. End Set
    126. End Property
    127. Private _trackLineSize As Integer
    128. <Category("TrackbarSettings")> _
    129. Public Property TrackLineSize As Integer
    130. Get
    131. Return _trackLineSize
    132. End Get
    133. Set(value As Integer)
    134. _trackLineSize = value
    135. If _trackLineSize > 15 Then _trackLineSize = 4
    136. Me.Invalidate()
    137. End Set
    138. End Property
    139. Private _buttonheight As Integer
    140. <Category("TrackbarSettings")> _
    141. Public Property ButtonHeight As Integer
    142. Get
    143. Return _buttonheight
    144. End Get
    145. Set(value As Integer)
    146. If value >= Me.Height Then
    147. Return
    148. Else
    149. _buttonheight = value
    150. Button.Size = New Size(Button.Size.Width, value)
    151. 'Button wird neu gezeichnet
    152. If Button IsNot Nothing Then
    153. Button.Size = New Size(Me.Width, Button.Size.Height)
    154. Button.Location = New Point(0, CInt(Math.Round((Me.Height - Button.Size.Height) / GetRange() * (_maximum - _value))))
    155. Me.Invalidate()
    156. End If
    157. End If
    158. End Set
    159. End Property
    160. #End Region
    161. Public Shadows Event ValueChanged(sender As Object)
    162. Private Button As TrackButton
    163. Private mdownPoint As Point
    164. Public Sub New()
    165. mdownPoint = New Point(-1, -1)
    166. Button = New TrackButton(New Point(0, 36), New Size(14, 28))
    167. Maximum = 100
    168. Minimum = 0
    169. LargeChange = 5
    170. Value = 0
    171. TrackLineColor = Color.DimGray
    172. TickFrequency = 25
    173. ButtonHeight = 28
    174. ShowTicks = True
    175. TickColor = Color.Gray
    176. TrackLineSize = 4
    177. Me.SetStyle(ControlStyles.SupportsTransparentBackColor Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint, True)
    178. InitializeComponent()
    179. Me.Size = New Size(14, 100)
    180. End Sub
    181. Protected Overrides Sub OnPaintBackground(pevent As System.Windows.Forms.PaintEventArgs)
    182. MyBase.OnPaintBackground(pevent)
    183. pevent.Graphics.SmoothingMode = SmoothingMode.HighQuality
    184. pevent.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality
    185. pevent.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic
    186. pevent.Graphics.DrawLine(New Pen(_trackLineColor, _trackLineSize), Me.Width \ 2, 0, Me.Width \ 2, Me.Height)
    187. If _showTicks Then
    188. For i As Integer = _minimum To _maximum Step _tickFrequency
    189. Dim yValue As Single = CSng((Me.Height - Button.Size.Height) / GetRange() * (i - _minimum) + Button.Size.Height \ 2)
    190. pevent.Graphics.DrawLine(New Pen(_tickColor, 1), 2.0F, yValue, CSng(Me.Width / 2 - 3), yValue)
    191. pevent.Graphics.DrawLine(New Pen(_tickColor, 1), CSng(Me.Width / 2 + 3), yValue, CSng(Me.Width - 2), yValue)
    192. Next
    193. End If
    194. End Sub
    195. Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    196. MyBase.OnPaint(e)
    197. Button.Paint(e.Graphics)
    198. End Sub
    199. Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
    200. Select Case keyData And Keys.KeyCode
    201. Case Keys.Up, Keys.Down, Keys.Right, Keys.Left
    202. Return True
    203. Case Else
    204. Return MyBase.IsInputKey(keyData)
    205. End Select
    206. End Function
    207. Private Sub Slider_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    208. If e.KeyCode = Keys.Down Then
    209. Value -= 1
    210. RaiseEvent ValueChanged(Me)
    211. ElseIf e.KeyCode = Keys.Up Then
    212. Value += 1
    213. RaiseEvent ValueChanged(Me)
    214. ElseIf e.KeyCode = Keys.PageUp Then
    215. Value += _largechange
    216. RaiseEvent ValueChanged(Me)
    217. ElseIf e.KeyCode = Keys.PageDown Then
    218. Value -= _largechange
    219. RaiseEvent ValueChanged(Me)
    220. ElseIf e.KeyCode = Keys.Home Then ' Pos1
    221. Value = _maximum
    222. RaiseEvent ValueChanged(Me)
    223. ElseIf e.KeyCode = Keys.End Then ' Ende
    224. Value = _minimum
    225. RaiseEvent ValueChanged(Me)
    226. End If
    227. End Sub
    228. Private Sub Slider_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    229. If New Rectangle(Button.Location, Button.Size).IntersectsWith(New Rectangle(e.Location, New Size(1, 1))) Then
    230. mdownPoint = New Point(0, e.Y - Button.Location.Y)
    231. End If
    232. End Sub
    233. Private Sub Slider_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    234. If mdownPoint.X >= 0 Then
    235. Dim oldvalue = Value
    236. Value = GetRange() - CInt(Math.Round((e.Y - mdownPoint.Y) / (Me.Height - Button.Size.Height) * GetRange())) + _minimum
    237. If Value <= _maximum And oldvalue <> Value Then
    238. RaiseEvent ValueChanged(Me)
    239. End If
    240. End If
    241. End Sub
    242. Private Sub Slider_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    243. mdownPoint = New Point(-1, -1)
    244. End Sub
    245. Private Sub Slider_MouseWheel(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    246. Dim oldvalue = Value
    247. If e.Delta > 0 Then
    248. Value += _largechange
    249. Else
    250. Value -= _largechange
    251. End If
    252. If Value <= _maximum And oldvalue <> Value Then
    253. RaiseEvent ValueChanged(Me)
    254. End If
    255. End Sub
    256. Private Sub Slider_SizeChanged(sender As Object, e As System.EventArgs) Handles Me.SizeChanged
    257. If Button IsNot Nothing Then
    258. Button.Size = New Size(Me.Width, Button.Size.Height)
    259. Button.Location = New Point(0, CInt(Math.Round((Me.Height - Button.Size.Height) / GetRange() * (_maximum - _value))))
    260. Me.Invalidate()
    261. End If
    262. End Sub
    263. Private Function GetRange() As Integer
    264. Return _maximum - _minimum
    265. End Function
    266. '############################-TrackButton-############################
    267. Private Class TrackButton
    268. Private _size As Size
    269. Public Property Size() As Size
    270. Get
    271. Return _size
    272. End Get
    273. Set(ByVal value As Size)
    274. _size = value
    275. GenerateImage()
    276. End Set
    277. End Property
    278. Private _location As Point
    279. Public Property Location() As Point
    280. Get
    281. Return _location
    282. End Get
    283. Set(ByVal value As Point)
    284. _location = value
    285. End Set
    286. End Property
    287. Private _trackButtonForeColor As Color
    288. Public Property TrackButtonForeColor() As Color
    289. Get
    290. Return _trackButtonForeColor
    291. End Get
    292. Set(ByVal value As Color)
    293. _trackButtonForeColor = value
    294. GenerateImage()
    295. End Set
    296. End Property
    297. Private _trackButtonBackColor As Color
    298. Public Property TrackButtonBackColor() As Color
    299. Get
    300. Return _trackButtonBackColor
    301. End Get
    302. Set(ByVal value As Color)
    303. _trackButtonBackColor = value
    304. GenerateImage()
    305. End Set
    306. End Property
    307. Private ButtonBitmap As Bitmap
    308. Public Sub Paint(e As Graphics)
    309. e.DrawImage(ButtonBitmap, Location)
    310. End Sub
    311. Public Sub New(l As Point, s As Size)
    312. Location = l
    313. Size = s
    314. TrackButtonForeColor = Color.Cyan
    315. TrackButtonBackColor = Color.Silver
    316. GenerateImage()
    317. End Sub
    318. Private Sub GenerateImage()
    319. Using bmp As New Bitmap(Size.Width, Size.Height), g As Graphics = Graphics.FromImage(bmp)
    320. g.SmoothingMode = SmoothingMode.HighQuality
    321. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    322. g.InterpolationMode = InterpolationMode.HighQualityBicubic
    323. g.Clear(_trackButtonBackColor)
    324. Using b1 As New LinearGradientBrush(New Point(0, 0), New Point(0, Size.Height), Color.FromArgb(70, Color.White), Color.FromArgb(70, Color.Black)), b2 As New LinearGradientBrush(New Point(0, 5), New Point(0, Size.Height - 6), Color.FromArgb(70, Color.Black), Color.FromArgb(70, Color.White))
    325. g.FillRectangle(b1, 0, 0, Size.Width, 5)
    326. g.FillRectangle(b1, 0, Size.Height - 6, Size.Width, 6)
    327. g.FillRectangle(b2, 0, 5, Size.Width, Size.Height - 11)
    328. End Using
    329. g.DrawLine(New Pen(_trackButtonForeColor, 2), 3, Size.Height \ 2, Size.Width - 3, Size.Height \ 2)
    330. g.DrawRectangle(New Pen(Color.FromArgb(90, Color.Black)), New Rectangle(0, 0, Size.Width, Size.Height))
    331. ButtonBitmap = CType(bmp.Clone, Bitmap)
    332. End Using
    333. End Sub
    334. End Class
    335. End Class



    Ist ein ganz alter Code aus meinen Anfängen, ich hab den auch nicht komplett selber entwickelt. Wollte mich bloß mal wieder daran probieren, weil mich das damals immer ziemlich genervt hat.
    Liebe Grüße
    sothere

    sothere schrieb:

    alter Code
    Leite die Klasse nicht von UserControl sondern von Trackbar ab.
    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!
    Das hatte ich ursprünglich auch. Allerdings konnte und kann ich dann nicht die Größe des Controls frei wählen, sondern immer nur einen Wert ändern, je nach der Orientation. Ich habe es zwar so hin bekommen das er als Orientation immer vertikal nimmt, aber die breite kann ich dann nicht ändern.
    Liebe Grüße
    sothere