0

我的代码有问题

单击撤消后,我无法在图像上绘图,我不知道为什么

这是我的代码

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
4

1 回答 1

2

那是因为您正在为特定的 Bitmap 对象创建一个 Graphics 对象。您只能使用它在该特定位图上绘制,当您将位图替换为撤消中的位图时,您仍在同一位图上绘图,但不再显示该位图。

与其创建一个 Graphics 对象并保留它,不如在需要时为当前位图创建一个,然后将其处理掉:

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
于 2009-05-14T11:49:04.030 回答