Default Property Problem

  • VB.NET
  • .NET 4.5

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

    Default Property Problem

    Hallo Community,

    ich habe seit gestern ein Problem mir einem Default Property.
    Ich habe eine Klasse (Lines abgeleitet von Shape) in der Klasse Primitives deklariert. Der Compieler meinte ich brauch ein Default Property.
    Intellisense hat es eingefügt. Nun wird mir aber die Figur (Lines) nicht mehr angezeigt. Ich denke weil irgendwo die Koordinaten etc fehlen.
    Aber wo muss ich da initialisieren oder kann ich das ganze Default Property umgehen da es ein ganzes Lines Objekt zurückgeben will!
    Das vereinfachte Programm hab ich angehängt.
    Hier der relevante Code:

    Primitives:

    VB.NET-Quellcode

    1. Public Class Primitives
    2. Public Shared Lines As New Lines()
    3. End Class


    Lines:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Lines
    3. Inherits Shape
    4. #Region "CLASS MULTILINES"
    5. #Region "MultiLines Private Variables"
    6. Private ReadOnly _e As PaintEventArgs
    7. Private ReadOnly _penData As PenData
    8. Private ReadOnly _coordinates As Point()
    9. #End Region
    10. #Region "Lines Properties"
    11. Default Public ReadOnly Property Test(e As PaintEventArgs, linesPenData As PenData, linesCoords As Point()) As Lines
    12. Get
    13. Return New Lines()
    14. End Get
    15. End Property
    16. Public Property LinesCaps As Boolean = True
    17. #End Region
    18. #Region "MultiLines Constructors"
    19. Public Sub New()
    20. End Sub
    21. Public Sub New(e As PaintEventArgs, penData As PenData, coordinates As Point())
    22. _e = e
    23. _penData = penData
    24. _coordinates = coordinates
    25. DrawMultiLines(_e, _penData, _coordinates)
    26. End Sub
    27. #End Region
    28. #Region "MultiLines Functions"
    29. Public Function DrawMultiLines(e As PaintEventArgs, penData As PenData, coordinates As Point()) As PaintEventArgs
    30. Dim linesPen As Pen
    31. linesPen = GeneratePen (penData)
    32. e.Graphics.DrawLines(linesPen, coordinates)
    33. linesPen.Dispose()
    34. Return e
    35. End Function
    36. #End Region
    37. #End Region
    38. End Class


    Form1:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _cmdDrawState as Boolean = False
    3. Private _lines As New Lines
    4. Private ReadOnly _linesPenData as New PenData()
    5. Private _linesCoords as Point()
    6. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    7. MyBase.OnPaint(e)
    8. _cmdDrawState = True
    9. _lines = Primitives.Lines(e, _linesPenData, _linesCoords)
    10. End Sub
    11. Public Sub InitializeShape()
    12. With _linesPenData
    13. .ShapeName = "Lines"
    14. .Alpha = 255
    15. .Red = 0
    16. .Green = 0
    17. .Blue = 255
    18. .Width = 10
    19. end With
    20. _linesCoords = {New Point(550, 220), New Point(800, 220),
    21. New Point(800, 220), New Point(800, 400),
    22. New Point(800, 400), New Point(550, 400)}
    23. End Sub
    24. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    25. InitializeShape()
    26. End Sub
    27. End Class


    Vielen Dank für Eure Mühe und Hilfe,
    Duster

    P.S.: Wie mach ich einklappbare Spoiler?
    Dateien

    Duster schrieb:

    VB.NET-Quellcode

    1. Private ReadOnly _e As PaintEventArgs
    Wozu braucht die Klasse PaintEventArgs als Member, wozu muss der Konstruktor PaintEventArgs als Parameter haben?
    PaintEventArgs als Return Value?
    Projekt mit Strict Off :?:

    Duster schrieb:

    Nun wird mir aber die Figur (Lines) nicht mehr angezeigt.
    Was wird wo nicht angezeigt?
    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
    Sorry das OptionStrictOff ist ein Copy&Past Fehler!
    PaintEventArgs als Return Value?

    Hab ich geänder!
    Wozu braucht die Klasse PaintEventArgs als Member

    Ist auch draußen. Bin halt noch Anfänger! <X
    wozu muss der Konstruktor PaintEventArgs als Parameter haben?

    Weil das LinesObjekt sich selbst zeichen soll!

    VB.NET-Quellcode

    1. e.Graphics.DrawLines(linesPen, coordinates)

    Findest Du die Lösung PaitEventArgs zu übergeben so schlecht?
    Was wird wo nicht angezeigt?

    Ich lasse zum Test ein blaues hufeisenförmiges LinesObjekt auf die Form zeichen, das klappt nicht!

    @ErfinderDesRades
    Hab ich aus einem ForenThread entnommen!
    Sollte man lassen wenn man nicht genau weiss was man tu!
    Wenn ich es wieder raus nehme kommt folgende Fehlermeldung:

    Fehler BC30469 Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.

    Ich habe "shared" entfernt und Primitives deklariert.

    VB.NET-Quellcode

    1. Private p As New Primitives

    und folgende Zeile in OnPaint geändert:

    VB.NET-Quellcode

    1. _lines = p.Lines(e, _linesPenData, _linesCoords)

    Jetzt sieht das für mich auch logischer und nachvollziehbarer aus.

    Der Fehler BC30469 ist auch weg aber gezeichnet wird trotzdem nichts! ;(
    Ich komm nicht drauf woran das liegt?!

    Wenn ich die Default Property auskommentiere kommt die Fehlermeldung:
    Die Klasse "Lines" kann nicht indiziert werden, da sie keine Standardeigenschaft hat.




    Vielen Dank für Eure schnellen Antworten,
    Duster

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Duster“ ()

    Duster schrieb:

    Findest Du die Lösung PaitEventArgs zu übergeben so schlecht?
    Jepp - das geht garnet.
    Zeichnen soll man im Paint-Event, und mit den PaintEventArgs, die einem da übergeben werden - keine anderen!
    Auch nicht das PaintEventArgs aufbewahren und später wieder-verwenden.
    Etwa wenn in der Zwischenzeit das Control vergrössert wurde, wird das dann veraltete PaintEventArgs anners malen, als du vielleicht erwartest.

    Duster schrieb:

    Wenn ich die Default Property auskommentiere kommt die Fehlermeldung:
    Die Klasse "Lines" kann nicht indiziert werden, da sie keine Standardeigenschaft hat.
    Ja natürlich - was soll denn sonst kommen?
    "Default Property" bedeutet eben, dass die Klasse indiziert werden kann, und wennde das wegnimmst, kann sie nicht mehr indiziert werden.

    Ansonsten ist eh alles krautnrübn - sorry.



    Ich hab glaub schonmal mit dir drüber geredet, dass die ganze Konstruktion mit dem PenData-Gedöhns nix bringt. Es gibt die Klasse Pen, und darin die Daten sind das wirkliche PenData. Da ein eigenes PenData zu basteln, wo der Kram auch drin ist, und das dann in Shapes oder wasweissich zu verteilen, nur um am Ende doch einen Pen draus zu bilden - bau die ganze Verschwurbelung einfach mal ab, oder lasses wies ist, und fang nochma neu an.

    Bastel dir eine Figure-Klasse, die genau eine Figur darstellen soll.
    Keine Lines - das wäre eine Auflistung, und Auflistungen gibts bereits, und zwar von bester Qualität.
    Die Figure kann mw. einen Pen haben, wenn sie sich mit einem Pen zeichnen soll.
    Kein PenData! Die Einstellungen für den Pen machste auch gleich am Pen, dafür ist die Pen-Klasse da.
    Im Form machste dann eine List(Of Figure) - dann haste deine Auflistung.
    Und zum Zeichnen, im Paint-Event, gehste mit ForEach alle Figures durch, rufst deren Draw()-Methode auf, und übergibst dort das Graphics, auf dem zu zeichnen ist.
    Erstmal das.
    Später kannste Figure dann auch beerben, und spezielle Figuren erfinden, die sich etwa als Rechteck malen statt als Linie oder sowas.

    Duster schrieb:

    Sorry das OptionStrictOff ist ein Copy&Past Fehler!
    Das ist eine Projekt-Eigenschaft.
    Visual Studio - Empfohlene Einstellungen
    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!

    Duster schrieb:

    P.S.: Wie mach ich einklappbare Spoiler?
    vlt. hier erklärt: Aber bitte sparsam nutzen. Es bringt iwie nix, Code, den man zeigen will, erstmal zu verstecken.
    Code verstecken ist sinnvoll bei sehr viel Code, bzw. wenns nicht so wichtig ist, dass der Code gelesen wird.
    Wenn du OwnerDrawing anwenden willst, empfehle ich dir, dich an bestimmten Ansätzen aus diesem Tut zu orientieren:
    OwnerDrawing

    Ich sag "bestimmte Ansätze", weil OwnerDrawing ermöglicht verschiedene, auch sehr unterschiedliche Ansätze, und damit beschäftigt sich das Tut.

    Aber die Samples, wo ein Canvas als Zeichenfläche, und eine Klasse Figure vorkommt, die könnten interessant für dich sein.
    Also (ich jetzt nochmal geguckt) die Card-Samples.
    Aber auch nur als Orientierung, denn meine Card-Klasse ist jeweils die einzige Figuren-Klasse im jeweiligen Projekt
    Deshalb war's nicht sinnvoll, eine Figure-Basis-Klasse zu proggen, von der Card geerbt hätte, und seine spezifische Ausprägung eingebracht.
    Kämen nun weitere Figuren hinzu - etwa iwelche Linien, Rauten oder Textbausteine, so wäre eine Figure-Basis auszulagern, die die Gemeinsamkeiten verschiedenartiger Figuren zusammenfasst.
    Ich verstehe im Moment noch nicht so richtig, was du vor hast und wieso du das so löst. Mein Ansatz wäre innerhalb der Form alles im FormPaint-Event abzuhandeln.
    Und mit einer List würde ich auch nicht unbedingt arbeiten, da Schleifen im Paint-Event bei mehrfachem Zeichnen zum Flackern führen.

    Form

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Public Class Form1
    4. Private gPath As New GraphicsPath
    5. Public Sub New()
    6. SetStyle(ControlStyles.UserPaint, True)
    7. SetStyle(ControlStyles.ResizeRedraw, True)
    8. SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    9. SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    10. InitializeComponent()
    11. SetGraphicsPath()
    12. End Sub
    13. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    14. With e.Graphics
    15. .SmoothingMode = SmoothingMode.HighSpeed
    16. .DrawPath(DrawingTools.GetPen(Tools.ColorType.Blue, 10), gPath)
    17. End With
    18. End Sub
    19. Private Sub SetGraphicsPath()
    20. gPath = New GraphicsPath
    21. DrawingFigures.AddLine(gPath, New Point(550, 220), New Point(800, 220))
    22. DrawingFigures.AddLine(gPath, New Point(800, 215), New Point(800, 405))
    23. DrawingFigures.AddLine(gPath, New Point(800, 400), New Point(550, 400))
    24. End Sub
    25. Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    26. SetGraphicsPath()
    27. End Sub
    28. End Class



    Für deine unterschiedlichen Figuren die du zeichnen willst, legst du dir dann eine separate Klasse mit dem Namen Figures an.

    Figures

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Public Class Figures
    4. Public Sub AddLine(ByRef gPath As GraphicsPath, ByVal pt1 As Point, ByVal pt2 As Point)
    5. gPath.StartFigure()
    6. gPath.AddLine(pt1, pt2)
    7. gPath.CloseFigure()
    8. End Sub
    9. End Class



    Für deine Pens, Brushes etc, kannst du dir falls nötig auch noch eine Klasse anlegen. Wie @ErfinderDesRades bereits geschrieben hat, verstehe ich den Sinn dahinter nicht so ganz, aber wenn du das möchtest, dann sollst dus haben:

    Tools

    VB.NET-Quellcode

    1. Public Class Tools
    2. Public Enum ColorType
    3. Blue
    4. Green
    5. Yellow
    6. Red
    7. Custom
    8. End Enum
    9. Public Function GetPen(ColorCode As ColorType, Width As Integer, Optional Alpha As Integer? = Nothing, Optional R As Integer? = Nothing, Optional G As Integer? = Nothing, Optional B As Integer? = Nothing) As Pen
    10. Select Case ColorCode
    11. Case ColorType.Blue
    12. Return New Pen(Color.FromArgb(255, 0, 0, 255), Width)
    13. Case ColorType.Green
    14. Return New Pen(Color.FromArgb(255, 0, 255, 0), Width)
    15. Case ColorType.Yellow
    16. Return New Pen(Color.FromArgb(255, 255, 255, 0), Width)
    17. Case ColorType.Red
    18. Return New Pen(Color.FromArgb(255, 255, 0, 0), Width)
    19. Case ColorType.Custom
    20. If Alpha IsNot Nothing AndAlso R IsNot Nothing AndAlso G IsNot Nothing AndAlso B IsNot Nothing Then
    21. Return New Pen(Color.FromArgb(Alpha, R, G, B), Width)
    22. Else
    23. Return New Pen(Color.Black, 10)
    24. End If
    25. Case Else
    26. Return New Pen(Color.Black, 10)
    27. End Select
    28. End Function
    29. End Class



    Der Einfachheit halber machst du dir die Klassen über ein Module verfügbar:

    ExtendedDrawing

    VB.NET-Quellcode

    1. Public Module ExtendedDrawing
    2. Public DrawingTools As New Tools
    3. Public DrawingFigures As New Figures
    4. End Module


    Bilder
    • Maske.PNG

      4,87 kB, 806×543, 8 mal angesehen


    Spezielle Frage zu euren Visual Basic-Projekten, Code-Design, SQL-Queries, etc. könnt ihr mir auch direkt schicken. Aber wenn ihr sie im Forum postet profitieren alle davon.

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

    Yanbel schrieb:

    da Schleifen im Paint-Event bei mehrfachem Zeichnen zum Flackern führen.

    Tun sie nicht.
    Wenn man mehrere Figuren zeichnen will, und auch deren Position verändern, dann braucht man mehrere Figure-Objekte in einer List(Of Figure).
    Aber GraphicsPath zu verwenden ist auf jeden Fall eine gute Idee - weil man da wirklich alle möglichen Formen reinpacken kann, sogar Schrift.
    Aber wenn der GrapicsPath dann als Ganzes aufs Canvas gemalt wird, hat er nur eine Farbe, und was drinnen ist, ist kaum zu verändern (Teile davon bewegen oder löschen).
    @ErfinderDesRades Da hast du natürlich recht. Das von mir genannte Beispiel lässt sich natürlich nur auf den oben geschilderten Fall anwenden. Ich hatte deinen Betrag auch nur überflogen, entschuldige dies bitte. So wie du die Liste abarbeitest hast du natürlich vollkommen Recht. Da flackert nichts. Du übergibst ja einzelnd ans Graphics von daher eine sehr viel schönere Lösung geb ich dir Recht.

    @Duster Wenn du da Dynamik reinbekommen willst wirst du auf jeden Fall deine Struktur grundlegend überarbeiten müssen. Das Tutorial dass @ErfinderDesRades gepostet hat, ist wirklich gut. Daran würde ich mich orientieren.


    Spezielle Frage zu euren Visual Basic-Projekten, Code-Design, SQL-Queries, etc. könnt ihr mir auch direkt schicken. Aber wenn ihr sie im Forum postet profitieren alle davon.
    @ErfinderDesRades, @Yanbel

    Ich melde mich so spät weil ich ehrenamtlicher Helfer bin, das ist echt stressig!

    Ich habe folgendes vor: Ich schreibe ein kleines interaktives Tutorial für die Nutzung von GDI+.
    Der Nutzer hat momentan die Möglichkeit über ListBoxen die verschiedenen GDI+ Shapes (Line, Rectangle, Ellipse, Lines, Bezier etc.) anzuwählen. Über einen Color Dialog und weitere Listboxen können die Farbe, der Alphakanal, die Width, die Line Caps und eben alle weiteren grundlegenden Eigenschaften und Funktionen verändert werden. Das werde ich vielleicht ändern und ein oder mehrere DGV's statt ListBoxen verwenden.
    Mit der Maus kann der User in diesem 1. Teil des Tutorials die betreffende GDI+ Shape verschieben, mehr nicht also keine großartige Dynamik.
    Ich werde noch die Möglichkeit einbauen dem Nutzer die Veränderungen der Parameter wie Koordinaten usw. vor Augen zu führen. Wahrscheinlich werde ich dafür ein RTF oder auch ein oder mehrere DGV's verwenden.

    In dem PenData Gedöns habe ich die Daten der jeweiligen Figur gespeichert. Hat der Nuzer zuerst line ausgewählt und Daten verändert, ist dann nach Rectangele, hat damit rumgespielt und ist dann wieder zurück zu Line waren seine Daten gespeichert und present!
    PenData fliegt raus!

    Ich habe pro GDI+ Shape eine Klasse also für einfache Linie.vb die Line für Kreise und Ellipsen die Ellipse.vb d.h. ich habe mit der Basisklasse 13 verschiedene Klassen (Datentypen).
    Das sind zu viele, das sehe ich ein.

    Euer Ratschlag ist also eine Klasse zu basteln die alle GDI+ Shapes darsellt. Also z.B. Figure.vb in der dann DrawLine, DrawRectangle etc aufgerufen wird. In Figure.vb sind auch alle Properties für Pen (Alpha, Farbe, width) vorhanden und natürlich LineCaps, LineJoins etc.!
    Mit

    VB.NET-Quellcode

    1. Dim Line as Figure
    wird dann eine Linie deklariert mit

    VB.NET-Quellcode

    1. Dim Rect as Figure
    ein Rechteck usw.
    Hab ich das so richtig verstanden :?:
    Stark vereinfachtes Beispiel:

    VB.NET-Quellcode

    1. Friend Class Figure
    2. Inherits Shape
    3. Private Sub DrawSingleLine(Parameter)
    4. e.Graphics.DrawLine(linePen, coords(0), coords(1))
    5. linePen.Dispose()
    6. End Sub
    7. Friend Sub DrawSingleRectangle(eParameter)
    8. e.Graphics.DrawRectangle(rectPen, coordinates)
    9. rectPen.Dispose()
    10. End Sub
    11. End Class


    Vielen Dank für Eure Hilfe,
    Duster

    P.S.: @Yanbel
    Ich dachte Module sind veraltet und man sollte anstelle von Modulen Klassen verwenden!

    Duster schrieb:

    Ich habe pro GDI+ Shape eine Klasse also für einfache Linie.vb die Line für Kreise und Ellipsen die Ellipse.vb d.h. ich habe mit der Basisklasse 13 verschiedene Klassen (Datentypen).
    Das sind zu viele, das sehe ich ein.

    Euer Ratschlag ist also eine Klasse zu basteln die alle GDI+ Shapes darsellt. Also z.B. Figure.vb in der dann DrawLine, DrawRectangle etc aufgerufen wird. In Figure.vb sind auch alle Properties für Pen (Alpha, Farbe, width) vorhanden und natürlich LineCaps, LineJoins etc.!
    Nö - würde ich nicht so raten.
    Viele Klassen sind auch nicht prinzipiell verkehrt - verkehrt sind verkehrte viele Klassen.

    Also nochmal: Was ich dir rate ist eine abstracte Klasse Figure, die BasisFunktionalität bereitstellt, wie protected Pen, Matrix, Bounds, Color - solche Dinge. Dazu gehört auch ein virtual void Draw(Graphics g).
    Von Figure erben weitere Klassen, etwa Line, Rectangle, Ellipse.
    Diese Erben überschreiben die virtual Draw(Graphics g), und führen je ihre eigene Zeichnung aus: Die Line-Klasse malt sich als Linie, die Rectangle-Klasse als Rechteck usw..
    Keinesfalls soll es eine Figure-Klasse geben, die sich mal als Linie, mal als Rechteck malt!
    Das Draw() der Figure-Klasse ist overridable - d.h. die malt selbst nix, sondern nur ihre Erben malen was.

    Das (abstract, virtual, override) ist Vererbungslehre - das musste dir aneignen, sonst kommste nicht weiter.

    Hier habich auch sowas in c# ausgearbeitet: mycsharp.de/wbb2/thread.php?threadid=51920
    (Leider sind die Bildle dort verschwunden - die waren fancih eiglich ziemlich beeindruckend.)

    Neu

    Hallo Leute,

    ich habe diesen älteren Thread verwendet weil ich
    dachte es macht keinen Sinn für die "quasi" gleiche Fragestellung einen
    neuen zu eröffnen das in diesem Thread schon viele Antworten enthalten
    sind und dieser Beitrag die Sache abschließen sollte.
    Ich hoffe ich habe da nicht gegen irgendwelche Forenregeln verstoßen!

    @ErfinderDesRades
    Ich habe in dem kleinen Testprogramm alles so abgeändert wie Du es in Deinem Beitrag (14) vorgeschlagen hast. Es siet jetzt sehr viel
    aufgeräumter und logischer aus.
    Nur bei meiner Verwendung Umsetzung von
    virtual void Draw(Graphics g)
    bin ich mir nicht wirklich sicher! Ist da alles im "grünen Bereich"?
    Für Kritik und Verbesserungsvorschläge bin ich wie immer offen ;)

    Das Programm habe ich natürlich angehäng!

    Form1.vb:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Drawing.Drawing2D
    3. Public Class Form1
    4. Private ReadOnly _cmdDrawState as Boolean = True
    5. Private Property Line As New Line()
    6. Private Property Ellipse As New Ellipse()
    7. Private _lineCoords As Point()
    8. Private _ellipseCoords as Drawing.Rectangle
    9. Private _lineDashStyle As DashStyle
    10. Private _ellipseDashStyle As DashStyle
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. InitializeShape()
    13. End Sub
    14. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    15. MyBase.OnPaint(e)
    16. _lineDashStyle = DashStyle.Dash
    17. _ellipseDashStyle = DashStyle.Dot
    18. If _cmdDrawState = True Then
    19. Line = New Line(e.Graphics, 255, 255, 201, 14, 10, _lineCoords, _lineDashStyle)
    20. Ellipse = New Ellipse(e.Graphics, 255, 181, 230, 29, 10, _ellipseCoords, _ellipseDashStyle)
    21. End If
    22. End Sub
    23. Public Sub InitializeShape()
    24. _lineCoords = {New Point(50, 120), New Point(450, 120)}
    25. _ellipseCoords = New Rectangle(50, 220, 400, 180)
    26. End Sub
    27. End Class


    Shape.vb:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Friend MustInherit Class Shape
    3. Friend Sub New()
    4. End Sub
    5. Friend Overridable Property Alpha As Integer
    6. Friend Overridable Property Red As Integer
    7. Friend Overridable Property Green As Integer
    8. Friend Overridable Property Blue As Integer
    9. Friend Overridable Property Width As Integer
    10. Friend MustOverride Property DStyle As DashStyle
    11. Friend Overridable Function GeneratePen() As Pen
    12. Return New Pen(Color.FromArgb(Alpha, Red, Green, Blue), Width)
    13. End Function
    14. Friend Overridable Sub Draw(e As Graphics)
    15. End Sub
    16. End Class


    Line.vb:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Friend Class Line
    3. Inherits Shape
    4. Private ReadOnly _coordinates As Point()
    5. Friend Overrides Property Alpha As Integer
    6. Friend Overrides Property Red As Integer
    7. Friend Overrides Property Green As Integer
    8. Friend Overrides Property Blue As Integer
    9. Friend Overrides Property Width As Integer
    10. Friend Overrides Property DStyle As DashStyle
    11. Friend Sub New()
    12. End Sub
    13. Friend Sub New(e As Graphics, alpha As Integer, red As Integer,
    14. green As Integer, blue As Integer, width As Integer, coordinates As
    15. Point(), dStyle As DashStyle)
    16. Me.Alpha = alpha
    17. Me.Red = red
    18. Me.Green = green
    19. Me.Blue = blue
    20. Me.Width = width
    21. Me.DStyle = dStyle
    22. _coordinates = coordinates
    23. Draw(e)
    24. End Sub
    25. Friend Overrides Sub Draw(e As Graphics)
    26. Dim linePen As Pen
    27. linePen = GeneratePen()
    28. linePen.DashStyle = DStyle
    29. e.DrawLine(linePen, _coordinates(0), _coordinates(1))
    30. linePen.Dispose()
    31. End Sub
    32. End Class


    Ellipse.vp:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Friend Class Ellipse
    3. Inherits Shape
    4. Private ReadOnly _coordinates As Rectangle
    5. Friend Overrides Property Alpha As Integer
    6. Friend Overrides Property Red As Integer
    7. Friend Overrides Property Green As Integer
    8. Friend Overrides Property Blue As Integer
    9. Friend Overrides Property Width As Integer
    10. Friend Overrides Property DStyle As DashStyle
    11. Public Sub New()
    12. End Sub
    13. Friend Sub New(e As Graphics, alpha As Integer, red As Integer,
    14. green As Integer, blue As Integer, width As Integer, coordinates As
    15. Rectangle, dStyle As DashStyle)
    16. Me.Alpha = alpha
    17. Me.Red = red
    18. Me.Green = green
    19. Me.Blue = blue
    20. Me.Width = width
    21. Me.DStyle = dStyle
    22. _coordinates = coordinates
    23. Draw(e)
    24. End Sub
    25. Friend Overrides Sub Draw(e As Graphics)
    26. Dim ellipsePen As Pen
    27. ellipsePen = GeneratePen()
    28. ellipsePen.DashStyle = DStyle
    29. e.DrawEllipse(ellipsePen, _coordinates)
    30. ellipsePen.Dispose()
    31. End Sub
    32. End Class


    Vielen Dank für Deine/ Eure Hilfe und Mühe,
    Duster
    Dateien