Laden...

c# WinForm - Zeichnen auf Panel-Control - finde gezeichnetes Bitmap nicht mehr, um es zu verschieben

Erstellt von mierli vor 9 Jahren Letzter Beitrag vor 8 Jahren 6.135 Views
M
mierli Themenstarter:in
12 Beiträge seit 2006
vor 9 Jahren
c# WinForm - Zeichnen auf Panel-Control - finde gezeichnetes Bitmap nicht mehr, um es zu verschieben

Hallo

Ihr habt mir hier schon mal sehr weitergeholfen, bei den Grundlagen für das Zeichnen mit WinForms-Applikationen mit C#.

Ich habe soweit alles notwendige programmieren können; einfügen einer Linie und wieder Löschen der Linie; Speichern des Panels mit der geänderten Grafik; Einfügen via Drag/Drap von Images auf das Image des Panels.

Und letzteres ist genau noch mein Problem - wenn der Benutzer ein Image via Drag/Drop auf das Panel schiebt, dann möchte ich es auch wieder löschen oder weiter verschieben können auf dem Panel-Control. So sieht mein Source-Code aus für das Einfügen der Grafik via Drag/Drop auf dem Panel:


void panelControl1_DragDrop(object sender, DragEventArgs e)
        {
            Point p = panelControl1.PointToClient(Cursor.Position);
            Point locationToDraw = new Point(p.X - viewInfo.ContentImageRectangle.Location.X, p.Y - viewInfo.ContentImageRectangle.Location.Y);
            Image image = e.Data.GetData(DataFormats.Bitmap) as Image;
            if (image == null)
                return;
            Bitmap bitmap = panelControl1.ContentImage as Bitmap;
            Bitmap newBitMap = new Bitmap(bitmap.Width, bitmap.Height);
            using (Graphics g = Graphics.FromImage(newBitMap))
            {
                g.DrawImage(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
                g.DrawImage(image, locationToDraw);
            }

            using (MemoryStream ms = new MemoryStream())
            {
                newBitMap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                ms.Position = 0;
                bitmap.Dispose();
                panelControl1.ContentImage = Image.FromStream(ms);
            }
        }


Dieses eingefügte Bild merke ich mir auch mit der Position und einer Nummer in einer List<MyImages>-Klasse - um die Positions-Daten für späteres Neu-Zeichnen zu haben.

Mein Problem jetzt -> wie finde ich auf dem Panel wieder zu dem eingefügten Bild ?? (um es zum Beispiel wieder zu löschen, oder weiter zu verschieben per Maus)

Es gibt hier ein paar Threads mit Grundlagen des Zeichnens und auch wie man mit der Maus Grafik-Objekte verschieben kann.....aber da komme ich dann mit meinem Code nicht zusammen. Vielleicht fange ich schon falsch an, beim Drag/Drop, so wie ich das Bild einfüge?
Ich habe mir das Tutorial "Gezeichnete Objekte mit der Maus verschieben" angesehen. Das wäre fein, wenn ich es auch für eine eingefügte Grafik/Image anwenden könnte

Vielleicht kann mir dazu bitte nochmals jemand weiterhelfen?!
Danke schon mal & schönen Gruß
Michael

2.298 Beiträge seit 2010
vor 9 Jahren

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

M
mierli Themenstarter:in
12 Beiträge seit 2006
vor 9 Jahren

Hallo
genau das habe ich schon gelesen bzw. das Demo-/Beispiel-Programm ausprobiert. Funktioniert super für alle Objekte, die laut dem Demo-Programm verwendet werden (Kreis, Linie, Text).

Aber ich habe ein Image - gezogen aus einer PictureBox, das auf dem Panel dann platziert wird.
....und da scheitere ich, um dieses Image dann weiter zu verwenden / weiter zu verschieben auf dem Panel oder wieder zu löschen.

Vielleicht hat jemand einen Rat.
Danke

2.298 Beiträge seit 2010
vor 9 Jahren

Das Beispiel lässt sich aus meiner Sicht gut übertragen, wenn du dir Position und Größe des Bitmaps auf dem Panel merkst.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

771 Beiträge seit 2009
vor 9 Jahren

Du könntest deine Images als Rectangle im GraphicsPath realisieren. Merke dir in einer Liste (oder Dictionary) zu jedem Rectangle das Bild. Beim Zeichnen dann erst erst den GraphicsPath zeichnen und dann anschließend an den Rectangle-Positionen die zugehörigen Images (per Graphics.DrawImage).
Zum verschieben dann entsprechend die Methoden aus dem Tutorial verwenden.

Alternativ kannst du natürlich auch alles ohne GraphicsPath realisieren, d.h. selber eine Methode Hit() schreiben, welche die Rectangle-Liste durchiteriert.

M
mierli Themenstarter:in
12 Beiträge seit 2006
vor 9 Jahren

Hallo
Danke Euch beiden für die Ansätze und Ideen, klingt schon mal nicht schlecht.

Da ich aber von der Grafik-Programmierung "so was von keiner Ahnung" habe, stehe ich leider bei der Ausführung an.
Auch wenn ich mich an dem Beispiel des Tutorials orientiere......so finde ich keinen Lösungsansatz, dies mit einem Image zu programmieren.

Kann mir vielleicht jemand einen kurzen Code-Ausschnitt zukommen lassen, wie ich denn hier weiterkomme.

Danke!!
Michael

4.939 Beiträge seit 2008
vor 9 Jahren

Hallo,

für Grafikprogrammierung kannst du dich in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) einlesen. Am besten erst einmal ein kleines Testprogramm schreiben, welches einfach ein paar Grafikobjekte (Rechtecke, Kreise, Texte) auf einem Panel zeichnet.
Und dann kannst du dich an dem Zeichnen von Bildern (per oben erwähnter Graphics.DrawImage-Methode) machen. In ca. 1-2h solltest du das hinbekommen. Und danach kannst du dich mit dem Verschieben deiner Bilder beschäftigen...

M
mierli Themenstarter:in
12 Beiträge seit 2006
vor 9 Jahren

Hallo
all diese Grundlagen hab ich schon durch.
Ich habe auch meine App. soweit, dass Zeichnen geht; dass auf das Panel ein Image aus einer PictureBox gezogen werden kann (drag/drop) usw. die Grafik komplett abspeichern.

Mein Problem ist lediglich - ich muss die gezeichneten Images auf dem Panel weiter verarbeiten können mit der Maus - weiter verschieben, oder wieder löschen. Und daran scheitere ich!
Es gelingt mir auch nicht, aus den Beispielen von diesem Forum es so abzuwandeln, dass ich eigene gezeichnete (per drag/drop gezeichnete) Images finde auf dem Panel.

....ich wäre auch bereit mich erkenntlich zu zeigen für jede Hilfestellung bei der Programmierung dieser Aufgabe.
Ich hätte schon eine kleine Demo-Form; bei der das Drag/Drop realisiert wurde. Es ginge da "nur mehr" um die Erweiterung, dass die Images, die auf das Panel gezogen werden verschoben oder gelöscht werden können.

Da ein wenig Zeitdruck bei dieser Projekt-Erweiterung gegeben ist, und ich auch noch andere Dinge realisieren muss, fehlt mir die Zeit mich in Ruhe auf sämtliche Themen und Tutorials einzulesen.

Danke schon mal für Rückmeldung.
Michael

M
mierli Themenstarter:in
12 Beiträge seit 2006
vor 8 Jahren

Danke der Idee und Hilfestellung eines Forum-Mitglieds wurde beim Problem bzw. meine Anfrage gelöst!!

Die Lösung sieht nun so aus, dass ich im DragDrop-Event des Panels ein PictureBox-Control erzeuge - dieses dann mit den jeweils hinein-gezogenen Image befülle; und auf diesem/diesen PictureBox-Control(s) dann auf die Mouse-Events oder auf das DoppelKlick-Event reagieren kann. Somit ist es leicht die eingefügte Symbole (via dem Pic.Box-Control) zu verschieben oder zu löschen.
...und natürlich auch das Abspeichern der einzelnen Symbole aus den erzeugten PictureBox-Controls war dann leicht zu lösen, in dem ich mir die Positions-Daten und das Image in einer Liste verwalte, und diese dann auch in der Datenbank gespeichert wird.

Schönen Gruß
Michael