Hilfe bei UserControl

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 52 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Hilfe bei UserControl

    Moin moin

    Ich wollte mir ein UserControl machen. Hatte den Code etwas geändert erst im "PaintEvent" der Form um zu sehen ob die Line auch so gezeichnet wird wie ich mir das Vorstellte. Klappe auch.
    Nun möchte ich das in ein UserControl umbauen, so das ich die Farbwerte, Start und End-Punkte usw eingeben kann.
    Begonnen mir der Pen(Dicke). In den Eigenschaften des Designers wird zwar " PWidth " angezeigt aber es lässt sich kein Wert ändern. Springt immer auf 4
    Ebenso ist nur ein leeres Control zu sehen.. siehe Bild-1. Mit dem neuen Code ist zwar die Line zu sehen aber den Wert kann ich noch immer niucht ändern.
    Weise ich dem Control eine BackgrundColor zu.. siehe Bild-2

    EDIT: Code überarbeitet hilft aber nichts.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.Drawing
    3. Public Class drawClass
    4. Public g As Graphics
    5. Dim ppWidth As Integer = 4
    6. Private ReadOnly lHight As Integer = 10
    7. Private ReadOnly lStart As Integer = 0
    8. Private ReadOnly lStop As Integer = 200
    9. Private ReadOnly Pen1 As Color = Color.FromArgb(200, 20, 20)
    10. Private ReadOnly Pen2 As Color = Color.FromArgb(250, 250, 250)
    11. Public Property PWIdth() As Integer
    12. Get
    13. Return ppWidth
    14. End Get
    15. Set(ByVal ppWidht As Integer)
    16. ppWidht = PWIdth
    17. End Set
    18. End Property
    19. Public Sub DrawgradLine(g As Graphics)
    20. Dim linGrBrush As LinearGradientBrush = New LinearGradientBrush(New Point(lStart, lHight), New Point(lStop, lHight), Pen1, Pen2)
    21. Dim pen As Pen = New Pen(linGrBrush, PWIdth)
    22. g.Clear(BackColor)
    23. g.DrawLine(pen, 0, lHight, lStop, lHight)
    24. End Sub
    25. Private Sub Me_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    26. DrawgradLine(e.Graphics)
    27. End Sub
    28. End Class

    Bilder
    • UserControl-1.jpg

      67,29 kB, 420×384, 80 mal angesehen
    • UserControl-2.jpg

      65,48 kB, 405×378, 58 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Amelie“ ()

    @Amelie Du musst den Wert auch anwenden.
    Probier mal so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class drawClass
    3. Private ppWidth As Integer = 4
    4. Private ReadOnly lHight As Integer = 10
    5. Private ReadOnly lStart As Integer = 0
    6. Private ReadOnly lStop As Integer = 200
    7. Private ReadOnly Pen1 As Color = Color.FromArgb(20, 20, 20)
    8. Private ReadOnly Pen2 As Color = Color.FromArgb(250, 250, 250)
    9. Public Property PWIdth() As Integer
    10. Get
    11. Return ppWidth
    12. End Get
    13. Set(ByVal PWIdth As Integer)
    14. ppWidth = PWIdth
    15. Invalidate()
    16. End Set
    17. End Property
    18. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    19. MyBase.OnPaint(e)
    20. Using linGrBrush As LinearGradientBrush = New LinearGradientBrush(New Point(lStart, lHight), New Point(lStop, lHight), Pen1, Pen2)
    21. Dim pen As Pen = New Pen(linGrBrush, ppWidth)
    22. e.Graphics.Clear(BackColor)
    23. e.Graphics.DrawLine(pen, 0, lHight, lStop, lHight)
    24. End Using
    25. End Sub
    26. End Class
    mit diesem Aufruf:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    3. DrawClass1.PWIdth = CInt(NumericUpDown1.Value)
    4. End Sub
    5. 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!

    Amelie schrieb:

    NumericUpDown1
    ist die Instanz eines NumericUpDown-Controld, das kannst Du aus der Toolbox auf die GUI ziehen.
    Gib ihr das Minimum 1.
    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

    Achso ;)

    Ich habe nun folgendes:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.Drawing
    3. Public Class drawClass
    4. Public g As Graphics
    5. Private ReadOnly lHight As Integer = 0
    6. Private ReadOnly lStart As Integer = 0
    7. Public Property lStop As Integer
    8. Public Property ppThiknes As Integer = 1
    9. Public Property Pen1 As Color = Color.FromArgb(200, 20, 20)
    10. Public Property Pen2 As Color = Color.FromArgb(50, 50, 150)
    11. Public Sub DrawgradLine(g As Graphics)
    12. lStop = Me.Width
    13. Dim linGrBrush As LinearGradientBrush = New LinearGradientBrush(New Point(lStart, lHight), New Point(lStop, lHight), Pen1, Pen2)
    14. Dim pen As Pen = New Pen(linGrBrush, ppThiknes)
    15. g.Clear(BackColor)
    16. g.DrawLine(pen, 0, lHight, lStop, lHight)
    17. End Sub
    18. Private Sub Me_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    19. DrawgradLine(e.Graphics)
    20. End Sub
    21. End Class

    So lassen sich die Farben und die Liniendicke ändern. Allerdings wird es auf der Form erst sichtbar wenn ich irgendwo hinklicke.
    Irgenwie fehlt das sowas wie ein " update " ??? ;)
    Bilder
    • UserControl-3.jpg

      215,69 kB, 683×500, 72 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Mit meinem Code malt er die Linie sofort, im Design-Modus.
    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!
    @Amelie Moving Target :!:
    Poste eine vollständige und belastbare Aufgabenstellung!
    Gib den Properties einen Getter und einen Setter und im Setter rufst Du Invalidate() auf.
    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

    Aber genau das hatte ich doch. Da liese sich der Wert aber NICHT ändern. Springt hier immer auf die 5 zurück!

    VB.NET-Quellcode

    1. Dim ppWidth As Integer = 5
    2. Public Property ppThiknes() As Integer
    3. Get
    4. Return ppWidth
    5. End Get
    6. Set(ByVal ppWidht As Integer)
    7. ppWidht = ppThiknes
    8. Invalidate()
    9. End Set
    10. End Property
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    VB.NET-Quellcode

    1. Invalidate()
    Diese Zeile habe ich da reingebaut.
    Bei mir geht es so, wie es sein soll.
    Hier der überarbeitete Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class drawClass
    3. Private ppWidth As Integer = 4
    4. Private ReadOnly lHight As Integer = 10
    5. Private ReadOnly lStart As Integer = 0
    6. Private ReadOnly lStop As Integer = 200
    7. Private _Pen1 As Color
    8. Private _Pen2 As Color
    9. Public Sub New()
    10. InitializeComponent()
    11. _Pen1 = Color.FromArgb(200, 20, 20)
    12. _Pen2 = Color.FromArgb(50, 50, 150)
    13. End Sub
    14. Public Property Pen1 As Color
    15. Get
    16. Return _Pen1
    17. End Get
    18. Set(value As Color)
    19. _Pen1 = value
    20. Invalidate()
    21. End Set
    22. End Property
    23. Public Property Pen2 As Color
    24. Get
    25. Return _Pen2
    26. End Get
    27. Set(value As Color)
    28. _Pen2 = value
    29. Invalidate()
    30. End Set
    31. End Property
    32. Public Property PWIdth() As Integer
    33. Get
    34. Return ppWidth
    35. End Get
    36. Set(ByVal PWIdth As Integer)
    37. ppWidth = PWIdth
    38. Invalidate()
    39. End Set
    40. End Property
    41. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    42. MyBase.OnPaint(e)
    43. Using linGrBrush As LinearGradientBrush = New LinearGradientBrush(New Point(lStart, lHight), New Point(lStop, lHight), Pen1, Pen2)
    44. Dim pen As Pen = New Pen(linGrBrush, ppWidth)
    45. e.Graphics.Clear(BackColor)
    46. e.Graphics.DrawLine(pen, 0, lHight, lStop, lHight)
    47. End Using
    48. End Sub
    49. 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!
    Bis auf das Du

    Quellcode

    1. ​Private ppWidth As Integer = 4
    und ich

    Quellcode

    1. ​Dim ppWidth As Integer = 4
    habe ist der Abschnitt doch gleich oder übersehe ich da etwas?
    Was macht hier dann den Unterschied Dim / Private aus??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Was macht hier dann den Unterschied Dim / Private aus??
    Das ist das selbe, nur Private ist direkt zu lesen.
    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!
    Also habe nun nochmal hier gelesen: ... microsoft /de-de/dotnet/visual-basic/language-reference/statements/dim-statement

    So richtig verstehe ich da den Unterschied nicht ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @RodFromGermany

    So habe mir ein weiteres UC gebastelt. Soweit macht es fast alles was es soll, nur ein Verhalten kann ich nicht erklären.
    Ziehe ich es auf das Form ist FontColor und LinenFarbe gleich. Soll so sein.
    Ändere ich nun die LinienFarbe und starte das Prog. nimmt die Linienfarbe wieder die FontFarbe an. hmmmmm??


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.ComponentModel
    3. Public Class UnderlineLabel
    4. Private lblhight As Integer
    5. Private lblwidth As Integer
    6. Private lineStop As Integer
    7. Private LineColor As Color
    8. Public Sub New()
    9. InitializeComponent()
    10. LineColor = Label1.ForeColor
    11. End Sub
    12. Public Property _Text As String
    13. Get
    14. Return Me.Label1.Text
    15. End Get
    16. Set(value As String)
    17. Me.Label1.Text = value
    18. End Set
    19. End Property
    20. Public Property ColorLine As Color
    21. Get
    22. Return LineColor
    23. End Get
    24. Set(value As Color)
    25. LineColor = value
    26. Invalidate()
    27. End Set
    28. End Property
    29. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    30. MyBase.OnPaint(e)
    31. Label1.BackColor = Color.Transparent
    32. lblhight = Label1.Height - 3
    33. lineStop = Label1.Width + 5
    34. Dim pen As Pen = New Pen(ColorLine, 2)
    35. e.Graphics.Clear(BackColor)
    36. e.Graphics.DrawLine(pen, 0, lblhight, lineStop, lblhight)
    37. Me.Height = Label1.Height + 6
    38. Me.Width = lineStop + 3
    39. End Sub
    40. 'Wird das beim Starten ausgeführt?
    41. Private Sub Label1_ForeColorChanged(sender As Object, e As EventArgs) Handles Label1.ForeColorChanged
    42. LineColor = Label1.ForeColor
    43. End Sub
    44. End Class

    Bilder
    • UserControl-4.jpg

      114,69 kB, 405×461, 67 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Nimm mal die Prozedur Label1_ForeColorChanged() raus.
    Das Übertrtagen machst Du bereits im Konstruktor.
    Mach lieber eine UnderlineLabel-Property TextColor, die die ForeColor des Labels setzt.
    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

    So scheint es nach erstenTest ´s zu funktionieren ;)
    Ich hoffe du meintest das so
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.ComponentModel
    3. Public Class UnderlineLabel
    4. Private lblhight As Integer
    5. Private lblwidth As Integer
    6. Private lineStop As Integer
    7. Private LineColor As Color
    8. Public Sub New()
    9. InitializeComponent()
    10. LineColor = Label1.ForeColor
    11. End Sub
    12. Public Property _Text As String
    13. Get
    14. Return Me.Label1.Text
    15. End Get
    16. Set(value As String)
    17. Me.Label1.Text = value
    18. End Set
    19. End Property
    20. Public Property ColorLine As Color
    21. Get
    22. Return LineColor
    23. End Get
    24. Set(value As Color)
    25. LineColor = value
    26. Invalidate()
    27. End Set
    28. End Property
    29. Public Property _ForeColor As Color
    30. Get
    31. Return ForeColor
    32. End Get
    33. Set(value As Color)
    34. Label1.ForeColor = value
    35. Invalidate()
    36. End Set
    37. End Property
    38. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    39. MyBase.OnPaint(e)
    40. Label1.BackColor = Color.Transparent
    41. lblhight = Label1.Height - 1
    42. lineStop = Label1.Width + 5
    43. Dim pen As Pen = New Pen(ColorLine, 2)
    44. e.Graphics.Clear(BackColor)
    45. e.Graphics.DrawLine(pen, 0, lblhight, lineStop, lblhight)
    46. Me.Height = Label1.Height + 6
    47. Me.Width = lineStop + 3
    48. End Sub
    49. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Overrides hinzugefügt

    @Amelie Nicht ganz:

    VB.NET-Quellcode

    1. Public Property MyForeColor As Color
    2. Get
    3. Return Label1.ForeColor
    4. End Get
    5. Set(value As Color)
    6. Label1.ForeColor = value
    7. Label1.Invalidate()
    8. End Set
    9. End Property

    VB.NET-Quellcode

    1. Label1.BackColor = Color.Transparent
    kommt in den Konstruktor des UserControls.
    ====
    Mit Overrides kannst Du die "üblichen" Namen der Properties verwenden:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class UnderlineLabel
    2. Private lblhight As Integer
    3. Private lineStop As Integer
    4. Private LineColor As Color
    5. Public Sub New()
    6. InitializeComponent()
    7. LineColor = Label1.ForeColor
    8. Label1.BackColor = Color.Transparent
    9. End Sub
    10. Public Overrides Property Text As String
    11. Get
    12. Return Me.Label1.Text
    13. End Get
    14. Set(value As String)
    15. Me.Label1.Text = value
    16. End Set
    17. End Property
    18. Public Property ColorLine As Color
    19. Get
    20. Return LineColor
    21. End Get
    22. Set(value As Color)
    23. LineColor = value
    24. Invalidate()
    25. End Set
    26. End Property
    27. Public Overrides Property ForeColor As Color
    28. Get
    29. Return Label1.ForeColor
    30. End Get
    31. Set(value As Color)
    32. Label1.ForeColor = value
    33. Label1.Invalidate()
    34. End Set
    35. End Property
    36. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    37. MyBase.OnPaint(e)
    38. lblhight = Label1.Height - 3
    39. lineStop = Label1.Width + 5
    40. e.Graphics.Clear(BackColor)
    41. Using pen As Pen = New Pen(LineColor, 2)
    42. e.Graphics.DrawLine(pen, 0, lblhight, lineStop, lblhight)
    43. End Using
    44. Me.Height = Label1.Height + 6
    45. Me.Width = lineStop + 3
    46. End Sub
    47. 'Wird das beim Starten ausgeführt?
    48. Private Sub Label1_ForeColorChanged(sender As Object, e As EventArgs) Handles Label1.ForeColorChanged
    49. LineColor = Label1.ForeColor
    50. End Sub
    51. 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!

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

    Public Overrides Property ForeColor As Color

    Hatte ich zuerst versucht aber bekam die Meldung ich müsse es auf Shared setzen, was dazu führt das es in den Eigenschaften nicht angezeigt wird.
    Ich teste gleich dein Code. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @RodFromGermanynull
    Hatte Deine letzten Änderungen übernommen. Wenn ich das UC dann auf die Form zog stürzte die ganze Entwicklungsumgebung ab. Mehrmals versucht.
    Heute morgen ein neues sauberes Projekt begonnen. Es hagelt plötzlich von Fehlern.
    Sowohl bei deinem letzten und auch bei meinem letzten Code.

    Auch bei meiner GradientLine ganz oben bekomme ich heute den Fehler: " Fehler 1 "InitializeComponent" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. "

    Ich verstehe es nicht mehr????? ;(
    Habe da doch nichts mehr dran geändert
    Bilder
    • UserControl-5.jpg

      555,42 kB, 721×912, 46 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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