es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

GIF de mi proyecto en ejecución

Tags:  ,

Answer

  1. Avatar for 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 a currentLine. En el evento MouseMove, agregamos el punto actual a currentLine, 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 la currentLine completada a lines y comenzamos una nueva currentLine.

    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.

Comments are closed.