Dibuja algunas líneas en una imagen con el movimiento del ratón.
Quiero dibujar unas líneas en una imagen utilizando el mouse en vb.net.
¡Mi problema es que cuando empiezo a dibujar la siguiente línea, la línea anterior desaparece!
¿Alguien puede ayudarme?
Adjunto mi código junto con una foto de mi proyecto en ejecución.
Dim st, en As New Point
Dim p As Pen
Private mouseButtonPressed As Boolean = False
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
p = New Pen(Color.Black, 2)
Dim g As Graphics = e.Graphics
g.DrawLine(p, st, en)
End Sub
Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
mouseButtonPressed = False
End Sub
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
If mouseButtonPressed Then
PictureBox1.Invalidate()
en = e.Location
End If
End Sub
Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = MouseButtons.Left Then
st = New Point(e.X, e.Y)
mouseButtonPressed = True
End If
End Sub
davy.ai
Para dibujar varias líneas en una imagen usando el movimiento del mouse en vb.net sin que la línea anterior desaparezca, es necesario hacer un seguimiento de las líneas anteriores y dibujarlas todas juntas. Una forma de hacer esto es almacenar los puntos de cada línea en una lista y dibujarlos todos en el evento Paint de PictureBox. Aquí está un ejemplo de código:
“`vb.net
Private lines As New List(Of List(Of Point))() ‘ Una lista de líneas, cada una con una lista de puntos
Private currentLine As New List(Of Point)() ‘ Una lista para almacenar la línea actual que se está dibujando
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
Dim p As New Pen(Color.Black, 2)
Dim g As Graphics = e.Graphics
For Each line In lines
g.DrawLines(p, line.ToArray()) ‘ Dibuja todas las líneas anteriores
Next
g.DrawLines(p, currentLine.ToArray()) ‘ Dibujar la línea actual
End Sub
Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = MouseButtons.Left Then
currentLine.Add(e.Location) ‘ Agregar el punto de inicio de la nueva línea
End If
End Sub
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
If e.Button = MouseButtons.Left Then
currentLine.Add(e.Location) ‘ Agregar el punto actual a la línea actual
PictureBox1.Invalidate() ‘ Invalidar el PictureBox para redibujar las líneas
End If
End Sub
Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
If e.Button = MouseButtons.Left Then
lines.Add(currentLine) ‘ Agregar la línea actual a la lista de líneas
currentLine = New List(Of Point)() ‘ Comenzar una nueva línea
End If
End Sub
“`
En este código, creamos dos listas: una para almacenar todas las líneas anteriores (
lines
) y otra para almacenar la línea actual que se está dibujando (currentLine
). En el evento MouseDown, agregamos el punto de inicio de la nueva línea acurrentLine
. En el evento MouseMove, agregamos el punto actual acurrentLine
, e invalidamos el PictureBox para desencadenar el evento Paint. En el evento Paint, dibujamos todas las líneas anteriores primero y luego dibujamos la línea actual. Finalmente, en el evento MouseUp, agregamos lacurrentLine
completada alines
y comenzamos una nuevacurrentLine
.Al hacer un seguimiento de todas las líneas anteriores, podemos dibujarlas todas juntas cada vez que se invalide el PictureBox, evitando que desaparezcan las líneas.