Laden...

Linie im Form zeichnen und verschieben

Erstellt von BoKat vor 17 Jahren Letzter Beitrag vor 17 Jahren 11.846 Views
B
BoKat Themenstarter:in
2 Beiträge seit 2007
vor 17 Jahren
Linie im Form zeichnen und verschieben

Hallo,

ich möchte auf einem Formular eine Linie zeichnen und diese dann bei Bedarf verschieben können. Mit GDI+ kann ich die Linie schon zeichnen, aber wie bekomme ich Zugriff auf diese Linie um ihre Position oder Farbe oder ... zu verändern?

Ich vermute, dass das nicht geht. Gibt es eine Alternative? Ein Line-Objekt habe ich bisher leider nicht gefunden.

🙂 BoKat

M
1.439 Beiträge seit 2005
vor 17 Jahren

Stimmt geht nicht.
Alternativen:
.Net 3.0 und WPF verwenden Stichwort Line class
oder
dir die Linie merken und bei mousemove/mouseclick prüfen, ob unter der Maus eine Linie ist.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo BoKat,

dazu gibt es sogar einen Artikel [Tutorial] Gezeichnete Objekte mit der Maus verschieben , nachdem es immer wieder Threads zu dem Thema gab.

Bitte vor dem Posten die Forumssuche benutzen und in unsere Knowledge Base gucken. Danke!

herbivore

B
BoKat Themenstarter:in
2 Beiträge seit 2007
vor 17 Jahren

Danke für den Hinweis auf den Artikel. Da habe ich wohl nicht lange genug gesucht.
Werde mich bessern.

Noch eine Frage. Kann ich .net 3.0 auch mit der Express Edition nutzen? - Ich fange gerade erst mit .net an.

Nochmal vielen Dank für die schnelle Reaktion.

🙂 BoKat

1.271 Beiträge seit 2005
vor 17 Jahren

Hallo BoKat,

Eigentlich kannst du die Neuerungen von .NET 3.0 überhaupt nicht mit Visual Studio 2005 nutzen. Es gibt aber Erweiterungen, mit denen du die neuen Features trotzdem teilweise hernehmen kannst (siehe Microsoft veröffentlicht .NET Framework 3.0 Final), funktioniert aber NICHT für die Express Editionen und du hast da keinen Designer für WPF oder ähnliches. Dafür musst du auf das nächste Visual Studio, Codename "Orcas", warten.

Gruß,
Thomas

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

M
174 Beiträge seit 2006
vor 17 Jahren

Also ich hab im .Net 2.0 ein Diagramm programmiert indem es auch horizontale und vertikale Linien gibt die mit der Maus verschoben werden können, ist eigentlich gar nich so schwer! Also falls du da noch irgendwo hängst kann ich gern ein paar Zeilen Code hier reinklatschen! Zur info vorweg, ich hab mir für jede Linie in einem PointF[] 3 Punkte gemerkte und dann muss man nur noch die x oder y Koordinate der Linie und die x oder y Koordinate der Maus ( je nachdem um was für eine Linie es sich dreht ) vergleichen!

Mfg Muphin

2.921 Beiträge seit 2005
vor 17 Jahren

Allgemein ist m.E. folgende Vorgehensweise zu benutzen (natürlich abwandelbar, je nachdem was gemacht werden soll):

Definiere in deiner Klasse, die das zu malende Objekt enthält, alle Properties und Methoden, die Du benötigst, z.B. BackColor.

Merke Dir in einer Liste, die Grafischen Objekte, es ist gut, wenn alle die gleiche Basisklasse haben. z.B. Shape, oder zumindest Schnittstelle.

Alle zu zeichnenden Objekte müssen sich in der Liste befinden.


List<Shape> m_aShape = new List<Shape>(); //generic list

Wenn die Objekte eine bestimmte Ausdehnung haben sollen, ist es sinnvoll diesen ein Rechtech zu spendieren.


public class CShape
{
    Rectangle m_Rectangle = Rectangle.Empty;
}

Ausserdem brauchst Du ja noch die Info, WO es gezeichnet werden soll


Point m_ptLocation = Point.Empty;

und am besten noch eine Zeichenmethode, die man überschreiben kann, falls man von der Klasse ableitet:


public class CRectangle : CShape
{
    public override void Draw(Graphics g)
   {
      //hier alles Zeichnen. z.B. mit
      g.FillRectangle(Brushes.Blue,this.Rectangle);
   }
}

Das Rechteck kannst Du am Anfang gerne (zur Einfachheit) aus

[csharp]
Rectangle Rectangle
{
    get{ return new Rectangle(this.Location,this.Size); }
}

ermitteln. Also nochmal: Location und Size sind Properties aus der Klasse CShape.

Jetzt fehlt noch eine wichtige Sache, um das Ding verschieben zu können:

Haben wir es mit der Maus getroffen, bei MouseDown?

Das machst Du jetzt in dem Control in dem Du das ganze zeichnest.
(Das überprüfen)

Also ergänzst Du die Klasse CShape um


public bool Hit(Point _ptMouse)
{
   return this.Rectangle.Contains(_ptMouse);
}

Jetzt hast Du das Objekt erwischt und Kannst es verschieben.

Schleife im Control:


foreach(CShape shape in ShapeList)
{
    shape.Hit(m_ptMouse); //m_ptMouse hier bei MouseMove holen, wenn linker Mausbutton gedrückt wurde...
}

Willst du jetzt noch Elemente fokussieren oder selektieren können mit der Maus?

Das kann ich auch gerne noch erklären, aber mach erst mal diesen Teil.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

1.271 Beiträge seit 2005
vor 17 Jahren

Hallo dr4g0n76,

Du sollst doch nicht einfach zusammenfassen, was in meinem (und in herbivore's) Artikel steht. Dann bekomm ich doch keine Hits mehr 😉

Gruß,
Thomas

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

2.921 Beiträge seit 2005
vor 17 Jahren

lol @progger. Sorry. 😉

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.