Erstellen eines Koordinatensystems mit GDI+

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

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

    Erstellen eines Koordinatensystems mit GDI+

    Hallo zusammen,

    Ich habe vor ein Grafikobjekt "CoordinateSystem" zu erstellen.
    Dieses Grafikobjekt befindet sich bereits in einer größeren Klasse mit dem Namen "DrawingManager"

    Der unten gezeigte Code funktioniert soweit wunderbar. Der Code hat jedoch die Anmutung einer Garagenbastelei.

    Ich empfinde die Parameterübergabe für die Achsen als ziemlich sperrig (vgl. Class Form1, Zeile 12). Das geht bestimmt einfacher.
    Wenn das Grafikobjekt "CoordinateSystem" im Form1 initialisert wird, muss ich für jede Grafikinstanz (Rahmen, x-Achse, y-Achse) ein eigenes Objekt mitgeben.
    Geht das nicht einfacher, indem diese Grafiken bereits in der Klasse "CoordinateSystem" instanziert werden?

    Am Ende der Reise möchte ich gerne über meine Form1 Klasse lediglich die Position und die Größe des Koordinatensystems beschreiben.
    Das dort Achsen eingezeichnet werden, soll später über die Klasse "CoordinateSystem" passieren. Denn die Eigenschaften der Achsen und deren Position ist später sowieso direkt abhängig von der Größe und Position des Koordinatensystems.

    Für eure Hilfe bin ich dankbar.
    Falls ich ein paar Begrifflichkeiten oben durcheinander gewirbelt haben sollte, weist mich ruhig daraufhin.
    Ich als aktueller Programmier-Noob habe da noch einiges zu lernen.

    Schönen Gruß
    Euer Don_Puno


    VB.NET-Quellcode

    1. 'Diese Klasse befindet sich im Namespace "DrawingManager"
    2. Public Class CoordinateSystem
    3. Private _surface As Graphics
    4. Private _color As Color
    5. Private _rahmen As Rectangle
    6. Private _xAxis As Graphics
    7. Private _yAxis As Graphics
    8. Public Sub New(Surface As Graphics, xAxis As Graphics, yAxis As Graphics, Color As Color, Rahmen As Rectangle)
    9. _surface = Surface
    10. _color = Color
    11. _rahmen = Rahmen
    12. _xAxis = xAxis
    13. _yAxis = yAxis
    14. Dim pt1x As New PointF(_rahmen.Location.X, _rahmen.Location.Y + (_rahmen.Size.Height) / 2)
    15. Dim pt2x As New PointF(_rahmen.Location.X + _rahmen.Size.Width, _rahmen.Location.Y + (_rahmen.Size.Height) / 2)
    16. Dim pt1y As New PointF(_rahmen.Location.X + (_rahmen.Size.Width / 2), _rahmen.Location.Y)
    17. Dim pt2y As New PointF(_rahmen.Location.X + (_rahmen.Size.Width / 2), _rahmen.Location.Y + _rahmen.Size.Height)
    18. _xAxis.DrawLine(Pens.Black, pt1x, pt2x)
    19. _yAxis.DrawLine(Pens.Black, pt1y, pt2y)
    20. _surface.DrawRectangle(Pens.Black, _rahmen)
    21. End Sub
    22. End Class



    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    3. mouse_pos_x = e.X
    4. mouse_pos_y = e.Y
    5. End Sub
    6. Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles MyBase.MouseClick
    7. Dim CoordinateSystem As New DrawingManager.CoordinateSystem(Me.CreateGraphics, Me.CreateGraphics, Me.CreateGraphics, Color.Transparent, New Rectangle(mouse_pos_x, mouse_pos_y, 250, 250))
    8. End Sub
    9. End Class


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Erster Gedanke: CreateGraphics??? Und das gleich 3x? Wer soll sich um das Zeichnen des Koordinatensystems (KS) kümmern? M.E. doch das Control, welches das KS verwendet. Daher wäre mein Gedanke, dass jenes Control sich die Koordinaten/Daten von der KS-Instanz holt und dann selber zeichnet. Warum sollte das KS das machen? Und vor allem: Warum im Konstruktor? Wann/wo wird denn dieses KS instanziiert? In einem Paint-EventHandler (was naheliegend wäre)? Dann wiederum könnte man noch e.Graphics an die KS-Instanz weitergeben. Aber so ist das m.E. deplatziert, overkill und ressourcenverschwenderisch/inperformat.

    ##########

    Ah, steht ja da: im Form_MouseClick-EventHandler. Seh ich als problematisch an. Denn was würde passieren, wenn man mehrmals klickt? Jedes mal eine neue KS-Instanz? Wird die auch wieder von Dir aufgeräumt (Stichwort Dispose wegen CreateGraphics)? Wenn, dann sollte die KS-Instanz eher zum Programmstart einmalig erstellt werden (ggf. später auch modifiziert werden) und beim Form-MouseClick sichtbar werden. Aber nicht erzeugt.
    Ich weiß zwar nicht, ob es Dir weiterhilft, aber der EdR hat mal ein Tut zum Thema OwnerDrawing gemacht, vielleicht kommst Du damit weiter.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Hallo VaporiZed,

    Danke dir für die schnelle Hilfe.
    Wie bereits am Anfang meines Threads angekündigt, bin ich noch blutiger Programmier-Noob. Das lässt sich sicher leicht am Programmierstil erkennen :saint:

    VaporiZed schrieb:

    Erster Gedanke: CreateGraphics??? Und das gleich 3x? Wer soll sich um das Zeichnen des Koordinatensystems (KS) kümmern?


    Das CreateGraphics habe ich aus einem urigen YouTube Tutorial entnommen, naja, zum "Ziel" hat es ja einigermaßen geführt. Der Debugger hat wenigstens nicht gemeckert.
    Ich verfolge das Ziel, dass ich eine Instanz von der Klasse "CoordinateSystem" erzeuge. Dieser Klasse gebe ich beim Instanziieren dann die Größe und Location und Ort mit.

    Zum Beispiel in etwa so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. 'Zeichenfläche: Beschreibt den Ort, wo gezeicht werden soll | Rahmen: Gibt die Location und Größe an
    3. Dim CoordinateSystem As New DrawingManager.CoordinateSystem(Zeichenfläche As Graphics, Rahmen As Rectangle)
    4. End Sub



    VaporiZed schrieb:

    Ah, steht ja da: im Form_MouseClick-EventHandler. Seh ich als problematisch an. Denn was würde passieren, wenn man mehrmals klickt? Jedes mal eine neue KS-Instanz? Wird die auch wieder von Dir aufgeräumt (Stichwort Dispose wegen CreateGraphics)? Wenn, dann sollte die KS-Instanz eher zum Programmstart einmalig erstellt werden (ggf. später auch modifiziert werden) und beim Form-MouseClick sichtbar werden. Aber nicht erzeugt.
    Ich weiß zwar nicht, ob es Dir weiterhilft, aber der EdR hat mal ein Tut zum Thema OwnerDrawing gemacht, vielleicht kommst Du damit weiter.


    Das Form_MouseClick-Eventhandler habe ich nur für schnelle Testzwecke implementiert. Klickt man mehrmals, wird jedesmal ein neues KS auf dem Form1 abgelegt. Solange bis der Arbeitsspeicher raucht.
    Das Stichwort "Dispose" im Zusammenhang mit OwnerDrawing werde ich mir nochmal näher anschauen. Damit der Rauchmelder nicht anschlagen braucht. Guter Hinweis, danke dafür.
    Im finalen Programm soll das KS einmal aufgerufen und später mit Daten gefüttert werden.



    VaporiZed schrieb:

    In einem Paint-EventHandler (was naheliegend wäre)? Dann wiederum könnte man noch e.Graphics an die KS-Instanz weitergeben. Aber so ist das m.E. deplatziert, overkill und ressourcenverschwenderisch/inperformat.


    Wie komme ich denn am geschicktesten zu einer ressourcen-schonenden Lösung mittels Paint-EventHandler? Hast du oder jemand weiteres eine Idee?
    Schau in das von mir in Post#2 verlinkte Tutorial rein, da wird's dann klar, da im Paint-EventHandler ja ein Graphics-Object mitgeliefert wird, welches dann genutzt werden kann bzw. sollte. Vielleicht kann u.a. der @ErfinderDesRades es noch zielgerichteter erklären als ich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Versteh ich das jetzt richtig?

    Du möchtest ein eigenes Koordinatensystem auf deiner Form gezeichnet haben, die sich z.B. auch bei Formgrössenänderung entsprechend anpasst? Gleichzeitig möchtest du die Mauspositionen als Koordinaten aufgeblendet haben. (TextBox, Statusliste, oder zeichnerisch etc.)

    In dem Falle ist es doch sinnvoller, wenn du ein eigenes Panel oder UserControl machst. Beide Controls können so viel es mir recht ist in Doublebuffer (UserControl ganz sicher) dargestellt werden, und beide Controls können mit dem Paint-Event arbeiten.

    Wie würde es am Schluss aussehen? Ein Bild wäre ganz gut.

    Für mich stellt sich dann gleich z.B. die Frage wie Skallieren der beiden Achsen? und noch vieles mehr....

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()