vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zeichnen 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel