Beim Klicken auf der Form einen Kreis erstellen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von PhoenixBlaster.

    Beim Klicken auf der Form einen Kreis erstellen

    Hi

    Ich habe eine Frage ich möchte wenn man auf die Form klickt das an dem Punkt wo ich geklickt habe ein Kreis gezeichnet wird. Ich hab gehört das das irgendwie mit GDI+ gehen soll ich weiß aber nicht wie.

    Den Code das man den Punkt beim Klicken speichert hab ich schon:

    Quellcode

    1. numPointX.Value = Cursor.Position.X
    2. numPointY.Value = Cursor.Position.Y



    Nun möchte ich aber das ein Kreis bei den Punkten gezeichnet wird.

    Tausend Dank im Voraus für Antworten! :)
    Im Paint-Event der Form kannst du mir e.Graphics.DrawEllipse einen Kreis zeichnen. Musst halt, je nach dem wie groß der sein soll, noch ein bisschen was rechnen.
    Edit: bzw. wenn du einen gefüllten kreis haben willst FillEllipse.

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

    PhoenixBlaster schrieb:

    bei den Punkten gezeichnet wird.
    Hier der Code für einen Kreis:

    VB.NET-Quellcode

    1. Private x As Integer = -100
    2. Private y As Integer = -100
    3. Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    4. x = e.X
    5. y = e.Y
    6. Invalidate()
    7. End Sub
    8. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    9. Dim rc = New Rectangle(x, y, 0, 0)
    10. rc.Inflate(50, 50)
    11. e.Graphics.DrawEllipse(Pens.Black, rc)
    12. End Sub
    Wenn Du ihn verstanden hast, überleg Dir, was Du machen musst, damit die "alten" Kreise stehenbleiben.
    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!

    enIking1998 schrieb:

    Es gibst doch auch .FillPie...
    Es gibt auch Ski-Unterwäsche.
    Jedoch braucht der TE weder diese noch "Pie", da ich dies ganz schlicht und ergreifend etwas anderes macht
    Füllt das Innere eines Kreisausschnitts, der durch eine Ellipse definiert wird, die durch ein Koordinatenpaar, eine Breiten-, eine Höhenangabe und zwei Radien angegeben ist.
    Pie ist somit ein Stück einer Ellipse bzw. eines Kreises.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Anstatt eines einzelnen Punktes musst du halt mehrere punkte speichern. Das geht am besten mit einer List(Of Point). Bei einem Klick fügst du der Liste die Cursorposition hinzu und im Paint-Event zeichnest du einen Kreis bei jedem Punkt (mit einer For-Schleife).
    Artentus hat dir doch schon die Lösung gegeben ...
    Hier ein Ansatz, wo aber noch etwas fehlt.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Public liste As New List(Of Point)
    4. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    5. 'der Liste e.Location hinzufügen
    6. 'hier noch aktualisieren
    7. End Sub
    8. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    9. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    10. For Each p As Point In liste
    11. MessageBox.Show(p.ToString())
    12. 'e.Graphics.FillEllipse(Brushes.Black, New Rectangle(p.X - 5, p.Y - 5, 10, 10))
    13. Next
    14. End Sub
    15. End Class
    Eigentlich ist das hier kein C&P-Forum, aber ich werd dir mal eine kleine Hilfe geben.
    Zum Speichern von Koordinatenpaaren legt man üblicherweise nicht zwei Variablen für X und Y an, da es bereits die Point-Struktur gibt, welche beides speichern kann.
    Wenn du nun mehrere Kreise anzeigen willst, so brauchst du folglich auch mehrere Koordinatenpaare, nämlich für jeden Kreis eines. Und um mehrere Instanzen eines Typs zu speichern eignet sich die generische List(Of T).
    Du legst dir also oben in deiner Form-Klasse eine neue List(Of Point) an. Dieser fügst du dann bei jedem Mausklick einen neuen Punkt hinzu.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim points As new List(Of Point)
    3. Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    4. points.Add(e.Location)
    5. Invalidate()
    6. End Sub
    7. End Class

    Zum zeichnen kannst du eigentlich den bisherigen Code verwenden, nur musst du ihn in eine For-Schleife packen, da du ja alle kreise zeichnen willst. Und statt den fixen Variablenangaben X und Y übergibst du der Methode halt die Koordinaten des Points mit dem jeweiligen Index.
    @enIking1998 Und weshalb sollte man eine Methode verwenden, welche mehr Parameter benötigt, für etwas anderes gedacht ist und zudem noch mehr performance braucht? Oder misst du auch immer 180° ab wenn du nen graden Strich zeichnest?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Dieser Code geht aber nicht:

    VB.NET-Quellcode

    1. Dim points As New List(Of Point)
    2. Private x As Integer = -100
    3. Private y As Integer = -100
    4. Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    5. x = e.X
    6. y = e.Y
    7. Invalidate()
    8. End Sub
    9. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    10. Dim rc = New Rectangle(x, y, 0, 0)
    11. rc.Inflate(50, 50)
    12. e.Graphics.DrawEllipse(Pens.Black, rc)
    13. points.add(rc)
    14. me.invalidate
    15. End Sub


    Beii "points.add(rc) gibt er einen Fehler aus. Und wo soll ich die For-Schleife erstellen?

    Die Fehlermeldung lautet: Der Wert von Typ "System.Drawing.Rectangle" kann nicht in "System.Drawing.Point" konvertiert werden

    CodeTags korrigiert ~VaporiZed

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

    @PhoenixBlaster: Weil Du den Code nicht verstanden hast.

    VB.NET-Quellcode

    1. Dim points As New List(Of Point)
    2. Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    3. points.Add(e.Location)
    4. Invalidate()
    5. End Sub
    6. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    7. For Each pt In points
    8. Dim rc = New Rectangle(pt, New Size)
    9. rc.Inflate(50, 50)
    10. e.Graphics.DrawEllipse(Pens.Black, rc)
    11. Next
    12. End Sub
    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!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim points As New List(Of Point)
    3. Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    4. points.Add(e.Location)
    5. Invalidate()
    6. End Sub
    7. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    8. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    9. For Each p In points
    10. e.Graphics.FillEllipse(Brushes.Black, New Rectangle(p.X - 5, p.Y - 5, 10, 10))
    11. Next
    12. End Sub
    13. End Class

    Sieht das wirklich so schwer aus?

    Vielen, vielen Dank, Artentus, RodFromGermany und alle anderen die mir geholfen haben

    Danke für den Code.

    Tschuldigung das ich mich so blöd angestellt habe. Eigentlich bin ich in VB ganz gut nur "Zeichnen" ist nicht gerade mein Spezialgebiet.