| |
VB.NET - Ein- und UmsteigerZeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Ortech | Datum: 07.11.10 17:22 |
| hallo Community
ich habe folg. Problem:
Ich lade ein Image in die Picturebox pb1.
Anschließend möchte ich mit der Maus mich auf diesem Image bewegen, wobei ich einen roten Kreis (mit DrawEllipse) auf die jeweilige Mausposition zeichne. Damit übermale ich mir aber das Image in dieser Picturebox.
Wie kann ich das verhindern? Sprich wie kann ich das Hintergrundbild unversehrt lassen.
Muss ich mir wirklich jeden einzelnen Bildpunkt, der von meinem Kreis überdeckt wird, zwischenspeichern und anschließend wieder hinmalen?
Oder muss ich nach jdem Zeichnen des Kreises das Image wieder neu reinladen?
Ich hoffe unter vb.net geht das einfacher. Würde mich über Vorschläge freuen.
Schöne Grüße
Alois | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: keco | Datum: 07.11.10 23:13 |
| Funktioniert es denn nicht mit e.Graphics.DrawImage(...) und anschließend e.Graphics.DrawEllipse(...) innerhalb der Paint-Methode der Picturebox? | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Ortech | Datum: 08.11.10 09:13 |
| Also folgender Ablauf:
Im Event Buttion1_Click wird das Image geladen
Im Event Mouse_Move wird eine Linie von einem definierten Startpunkt auf der pb1 bis zum Mousecursor (e.X, e.Y) gezeichnet. Solange sich die Maus bewegt, "bewegt" sich auch die Linie (Drawline), nur wen ich eine neue Linie zeichne, muss die alte Linie "verschwinden", aber wie mach ich das?
Im Event Mouse_Click wird dann eine fixe Linie gezeichnet.
Das Spiel wiederholt sich solange bis ich den Plan mit Linien eingezäunt hab.
War das verständlich?
Also ich hab einen Grundrissplan, auf welchem ich jeden Eckpunkt anklicke und jeweils eine fortlaufende Linie soll gezeichnet werden.
Hast du dazu eine Idee?
P.s: hab vom "Inavlidate" gelesen, das verstehe ich nicht ganz, wie das arbeitet. Könnte mir das weiterhelfen?
lg Alois | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Manfred X | Datum: 08.11.10 09:44 |
| Hallo!
So völlig klar ist mir Deine Absicht nicht.
Du willst anscheinend den Benutzer dabei graphisch unterstützen,
die Punkte eines Vielecks festzulegen, das einen Bereich
der Zeichnung umzäunen soll?? In dem Fall sollten aber die
bereits festgelegten Punkte und Verbindungslinien noch sichtbar
sein. (Sind das diese "fixen" Linien?)
Beim Löschen müßte dann der zuletzt festgelegte Punkt gelöscht
werden, zusammen mit der Verbindunslinie zum vorletzten - oder?
Was genau bedeutet "neue" und "alte" Linie?
Liege ich total daneben?
MfG
Manfred | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Ortech | Datum: 08.11.10 11:14 |
| ich versuchs anders zu erklären:
Solange ich im mouse_move Event bin, wird eine Hilfslinie gezeichnet (oder auch ein Fadenkreuz), die sich in Abhängigkeit von der aktuellen Mausposition immer neu zeichnet.
Drücke ich dann die linke Maustaste, soll im mouse_click Event die Linie fix (unveränderbar) gezeichnet werden. Dieser Klick-Punkt ist gleich der neu entstandene Anfangspunkt für die sich bewegende (Hilfs-)Linie ( die Linie, die im mouse_move gezeichnet wird).
u.s.w.
war das verständlich? | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Manfred X | Datum: 08.11.10 12:00 |
| Hallo!
Vielleicht so etwas. Schnell mal hingeproggt ....
Durch Verwendung einer Liste und dauerndes Neuzeichnen
der Figur kannst Du einfach Punkte löschen und an
beliebiger Stelle hinzufügen.
Der Plan wird im Hintergrund angezeigt und nicht geändert.
Zum Schluss kannst Du die gesamte Zeichnung in die
Hintergrund-Bitmap übertragen.
Public Class frmPolygon
Dim hbmp As Drawing.Bitmap
Dim vbmp As Drawing.Bitmap
Dim grp As Drawing.Graphics
Dim myPoints As New Collections.Generic.List(Of Point)
Private Sub frmPolygon_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
hbmp = New Bitmap("Pfad und Name der Hintergrund-Zeichnung")
pbox.BackgroundImage = hbmp
pbox.BackgroundImageLayout = ImageLayout.None
vbmp = New Bitmap(hbmp.Width, hbmp.Height)
grp = Graphics.FromImage(vbmp)
grp.Clear(Color.Transparent)
pbox.Image = vbmp
End Sub
Private Sub pbox_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbox.MouseDown
myPoints.Add(New Point(e.X, e.Y))
DrawFigure()
End Sub
Private Sub DrawFigure()
grp.Clear(Color.Transparent)
For i As Integer = 0 To myPoints.Count - 1
grp.DrawEllipse(New Pen(Color.Red, 1), myPoints(i).X - 2, myPoints( _
i).Y - 2, 4, 4)
If i > 0 Then
grp.DrawLine(New Pen(Color.Blue, 1), myPoints(i - 1), myPoints( _
i))
End If
Next i
pbox.Invalidate() : pbox.Update()
End Sub
Private Sub pbox_MouseMove(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbox.MouseMove
If myPoints.Count < 1 Then Exit Sub
DrawFigure()
Dim lp As Point = myPoints(myPoints.Count - 1)
Dim mp As Point = New Point(e.X, e.Y)
grp.DrawLine(New Pen(Color.Black, 1), lp, mp)
pbox.Invalidate() : pbox.Update()
End Sub
End Class | |
Re: Zeichnen auf Picturebox ohne den Hintergrund (Bild) zu übermalen | | | Autor: Ortech | Datum: 08.11.10 12:15 |
| Danke, genau das hab ich gesucht.
Hab wohl zu kompliziert herumgedacht.
Hatte schon eine 2. transparente Picturebox über die mit dem Plan gelegt und so weiter.
Dabei hab die pb1 ja die Eigenschaft Image UND backgroundimage.
Super.
Danke, Manfred!
Alois | |
INVALIDATE und das UPDATE im Vgl. zu REFRESH | | | Autor: Ortech | Datum: 08.11.10 12:17 |
| könntest du mir bitte trotzdem dieses INVALIDATE und das UPDATE erklären? Besonders im Vgl. zu REFRESH? | |
Re: INVALIDATE und das UPDATE im Vgl. zu REFRESH | | | Autor: Manfred X | Datum: 08.11.10 12:36 |
| Hallo!
Da gibt es nicht viel zu sagen (siehe Doku)!
Durch "Invalidate" wird mitgeteilt, das ein Bereich der
Picturebox (Parameter) bzw. die gesamte Picturebox neu
gezeichnet werden soll. Das Paint-Ereignis (das ich im Beispiel
nicht verwendet habe!) wird dann für diesen Bereich (e.ClipRectangle)
ausgelöst und man kann Zeichenoperationen in diesem Event durchführen.
(Zu dem Zweck erhält man das Graphikobjekt der Picturebox als
Parameter mit dem man zeichnen kann "e.graphics").
(Ich habe im Beispiel Bitmaps verwendet, um darin zu zeichnen.
Das Picturebox-Control dient dabei zur Anzeige und muss nach
Änderungen der zugewiesenen Bitmap neu gezeichnet werden.)
"Update" sorgt dafür, dass die durch "Invalidate" gekennzeichneten
Bereich(e) (oder alles) aktualisiert gezeichnet werden.
"Refresh" ist eine Kombination beider Methoden und erzwingt
das sofortige Neuzeichnen des gesamten Controls und aller
Controls, für die es als Container fungiert.
In meinem Beispiel könntest Du auch "Refresh" verwenden, statt
der Kombination von Invalidate/Update.
MfG
Manfred
Beitrag wurde zuletzt am 08.11.10 um 12:38:58 editiert. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|