Pregunta

Tengo un problema con mi código

después de que haga clic en Deshacer no puedo dibujar sobre la imagen y no sé por qué

Este es mi código

Imports System.Drawing.Graphics
Imports System.Drawing.Bitmap
Imports System.Drawing
Public Class FrmChild
    Dim Xstart As Short
    Dim Ystart As Short
    Dim Xend As Short
    Dim Yend As Short
    Dim BoolErasing As Boolean = False
    Dim BoolDrawing As Boolean = False
    Dim Image As New Bitmap(1500, 1200)
    Public GraphFun As Graphics = Graphics.FromImage(Image)
    Dim ErasingPen As New Pen(Drawing.Color.White, 3)
    Dim DrawingPen As New Pen(Drawing.Color.Black, 3)
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        undo.Push(Image.Clone())
        redo.Clear()
        btnredo.Enabled = False
        If Not btnundo.Enabled Then btnundo.Enabled = True
        Xstart = e.X
        Ystart = e.Y
        If btnEraser Then
            BoolErasing = True
        ElseIf btnPencil Then
            BoolDrawing = True
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If BoolErasing Then
            GraphFun.DrawLine(ErasingPen, Xstart, Ystart, e.X, e.Y)
        ElseIf BoolDrawing Then
            GraphFun.DrawLine(DrawingPen, Xstart, Ystart, e.X, e.Y)
        End If
        Xstart = e.X
        Ystart = e.Y
        PictureBox1.Image = Image
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Xend = e.X
        Yend = e.Y
        BoolErasing = False
        BoolDrawing = False
        PictureBox1.Image = Image
    End Sub


    Private Sub Btnundo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnundo.Click
        If Not btnredo.Enabled Then btnredo.Enabled = True
        redo.Push(Image.Clone())
        Image = undo.Pop()
        PictureBox1.Image = Image
        If undo.Count = 0 Then
            btnundo.Enabled = False
        End If
    End Sub


    Private Sub FrmChild_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        btnundo.Enabled = False
        btnredo.Enabled = False
    End Sub

    Private Sub btnredo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnredo.Click
        If Not btnundo.Enabled Then btnundo.Enabled = True
        undo.Push(Image.Clone())
        Image = redo.Pop()
        PictureBox1.Image = Image
        If redo.Count = 0 Then btnredo.Enabled = False
    End Sub
End Class
¿Fue útil?

Solución

Esto se debe a que está creando un objeto Graphics para un objeto de mapa de bits específica. Sólo se puede utilizar eso para disponer de dicho mapa de bits específica, cada vez que cambie el mapa de bits con uno de la de deshacer, todavía se está dibujando en el mismo mapa de bits, pero que uno no se muestra más.

En lugar de crear un objeto Graphics y aferrándose a ella, crear uno para el mapa de bits actual cuando lo necesite, y disponer de ella después:

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
   Using graphFun As Graphics = Graphics.FromImage(Image)
      If BoolErasing Then
         GraphFun.DrawLine(ErasingPen, Xstart, Ystart, e.X, e.Y)
      ElseIf BoolDrawing Then
         GraphFun.DrawLine(DrawingPen, Xstart, Ystart, e.X, e.Y)
      End If
   End Using
   Xstart = e.X
   Ystart = e.Y
   PictureBox1.Image = Image
End Sub
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top