VB.NET - In Paintbox Objekte erzeugen (zeichnen)

Terminator2

Erfahrenes Mitglied
Hallo,

Habe eine PictureBox mit einem Bild, in dem ich dann weitere Objekte erzeugen will. Im Moment sind es nur gefüllt Rechtecke. Der Code funktioniert schon echt gut, ich würde nur gerne das Objekt während des Erzeugens sichtbar machen. Wenn ich die Maustaste drücke, lege ich damit den Startpunkt fest. Beim Loslassen wird der Endpunkt berechnet und das Rechteck gezeichnet. Während des Ziehens sieht man jedoch nichts. Kann mir jemand sagen, wie ich das Rechteck auch während ich die Maus bewege anzeige ohne dass sich die Felder alle überlagern?

Hier erstmal mein bisheriger Code:
Code:
Public Class Form1
    Private MausPosition(,) As Integer = Nothing

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        ReDim MausPosition(0, 1)
        MausPosition(0, 0) = e.X
        MausPosition(0, 1) = e.Y
    End Sub

    Private Sub PictureBox1_MouseUp1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Dim GlasImage As New Bitmap(PictureBox1.Width, PictureBox1.Height)            
        GlasImage = PictureBox1.Image
        Dim newGraphics As Graphics = Graphics.FromImage(GlasImage)
        Dim X, Y, W, H As Integer
        X = (GlasImage.Width / PictureBox1.Width) * MausPosition(0, 0)
        Y = (GlasImage.Height / PictureBox1.Height) * MausPosition(0, 1)
        W = (GlasImage.Width / PictureBox1.Width) * (e.X - MausPosition(0, 0))
        H = (GlasImage.Height / PictureBox1.Height) * (e.Y - MausPosition(0, 1))

        If W < 0 Then
            W = W * (-1)
            X = X - W
        End If

        If H < 0 Then
            H = H * (-1)
            Y = Y - H
        End If

        newGraphics.FillRectangle(New SolidBrush(Color.LimeGreen), X, Y, W, H)

        newGraphics.Dispose()

        PictureBox1.Image = GlasImage
    End Sub
End Class
 
MouseMove bedeutet einfach nur bewegen, ob ich nun geklickt habe oder nicht. Außerdem würde das Rechteck dann immer überlagert, weil er ja bei jeder Bewegung ein neues hinzufügt. Dann müsste ich den Mauszeiger auf direktem Wege zum Zielpunkt bewegen, und genau das soll ja erleichtert werden.
Im Grunde genommen soll das Programm später so funktionieren wie Paint. Nicht alle Funktionen muss es können. Ich will Rechtecke, Ellipsen, Linien und Texte einfügen können. Eine Art Plugin gibt es nicht oder?

Gruß David
 
Natürlich, das Thema habe ich mir durchgelesen.
Vom Prinzip her ist das genau das Richtige, hat das denn Jemand in Visual Basic? Mit C# komm ich so gar nich klar, weil ich nicht die eigentlichen Befehle herausbekomme.
Dass das Gemalte nach dem Loslassen der Maustaste auch wieder verschwindet ist gut.
Es sollte sich nur nicht überzeichnen, eigentlich soll es so funktionieren wie das Markieren auf dem Desktop. Den Rest bekomme ich schon selber hin ;)


Gruß David
 
Hallo,

Das mit dem Zeichnen klappt mittlerweile schon sehr gut.
Ich wollte jedoch mehrere Farben auswählbar haben, da gibt es einen ColorDialog, wie bei Windows üblich. mit dem kann ich alle möglichen Farben auswählen. Wie kann ich aber diese Werte des Types Color in den Typ Brush für meine gefüllten Recktecke etc. umwandeln?
Hier ein kleines Codebeispiel:
Code:
Dim Stift As Pen = New Pen(ColorDialog1.Color, 5)
Dim Farbe As Brush = Brushes.Black

Select Case DrawType
 Case 1
   g.DrawRectangle(Stift, New Rectangle(X, Y, W, H))
 Case 2
   g.FillRectangle(Farbe, New Rectangle(X, Y, W, H))
End Select


Gruß David
 
Hi,

wenn es nur eine gleichmäßige, einfarbige Fläche sein soll:

Visual Basic:
Dim Farbe As Brush = New SolidBrush(ColorDialog1.Color)

Grüße, D.
 
Das soll es, danke ;)

Edit:
Weiß jemand, wo man Icons oder Bilder von den Tasten herbekommt, die in Paint zum Zeichnen verwendet werden? Bis auf den Bleistift für die Freihandzeichnung habe ich die selber gemacht. Nur den Bleistift habe ich nicht. Dazu wäre evtl. noch das "Verschieben"-Kreuz mit den 4 Pfeilen gut. Hat dazu jemand eine Idee?


Gruß David
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück