Drawing Graphics Disappear in VB.net

2019-02-25 13:26发布

I have a simple program that you can draw on the screen with FillEllipse and FillRectangle. My problem is that when you drag another window over even a small portion of the screen, that part will be erased. This happens when you drag the other window over, let go, and drag it back off. Is there any way to fix this?

Dim MyFormObject As Graphics = Me.CreateGraphics
        Select Case shape
            Case "Ellipse"
                MyFormObject.FillEllipse(brush, e.X - CInt(brushWidth / 2), e.Y - CInt(brushHeight / 2), brushWidth, brushHeight)
            Case "Rectangle"
                MyFormObject.FillRectangle(brush, e.X - CInt(brushWidth / 2), e.Y - CInt(brushHeight / 2), brushWidth, brushHeight)
        End Select

5条回答
聊天终结者
2楼-- · 2019-02-25 13:49

@SLaks already told you to do all painting in the OnPaint method. Here's a little more information. If you're trying to draw on a form, you would override the OnPaint method and do all you painting using the Graphics instance that is passed into the method. Here is more information on the topic:

http://www.bobpowell.net/creategraphics.htm

http://www.bobpowell.net/picturebox.htm

Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(e)

    e.Graphics.FillEllipse(Brushes.Red, Me.ClientRectangle)
End Sub
查看更多
冷血范
3楼-- · 2019-02-25 13:50

just a insight, what really helped me with draw in vb.net was this example vbnettuthut.blogspot.com it show a complete example to draw smooth and fast, with working example and source cod

查看更多
我命由我不由天
4楼-- · 2019-02-25 14:02

The following code allows you to draw a rectangle with the mouse (click and drag). Add a PictureBox to a form.

Public Class Form1
  Private mpntMouseDown As Point

  Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim w As Integer = PictureBox1.Width
    Dim h As Integer = PictureBox1.Height
    Dim bmp As New Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    Using g As Graphics = Graphics.FromImage(bmp)
      Dim rct As New RectangleF(0, 0, w, h)
      Dim b As Brush = New System.Drawing.Drawing2D.LinearGradientBrush(rct, Color.White, Color.Blue, 0)
      g.FillRectangle(b, rct)
      g.DrawEllipse(Pens.Blue, New RectangleF(CInt(0.1 * w), CInt(0.2 * h), CInt(0.8 * w), CInt(0.6 * h)))
      g.FillEllipse(Brushes.Yellow, New RectangleF(CInt(0.1 * w) + 1, CInt(0.2 * h) + 1, CInt(0.8 * w) - 2, CInt(0.6 * h) - 2))
      Dim sft As New StringFormat
      sft.Alignment = StringAlignment.Center
      sft.LineAlignment = StringAlignment.Center
      g.DrawString("Sample Image", New Font(System.Drawing.FontFamily.GenericSerif, 14, FontStyle.Italic, GraphicsUnit.Point), Brushes.Red, rct, sft)
    End Using
    PictureBox1.Image = bmp
  End Sub

  Private Sub PictureBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Left Then
      mpntMouseDown = e.Location
    End If
  End Sub

  Private Sub PictureBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
    If mpntMouseDown = Nothing Then Exit Sub
    Using g As Graphics = Graphics.FromImage(PictureBox1.Image, Bitmap)
      Dim rct As New Rectangle
      If mpntMouseDown.X < e.X Then
        rct.X = mpntMouseDown.X
        rct.Width = e.X - mpntMouseDown.X + 1
      Else
        rct.X = e.X
        rct.Width = mpntMouseDown.X - e.X + 1
      End If
      If mpntMouseDown.Y < e.Y Then
        rct.Y = mpntMouseDown.Y
        rct.Height = e.Y - mpntMouseDown.Y + 1
      Else
        rct.Y = e.Y
        rct.Height = mpntMouseDown.Y - e.Y + 1
      End If
      g.DrawRectangle(Pens.Black, rct)
    End Using
    mpntMouseDown = Nothing
    PictureBox1.Invalidate()
  End Sub
End Class
查看更多
Bombasti
5楼-- · 2019-02-25 14:09

You can put a PictureBox control on your form and draw to that instead and it won't be erased when other windows paint over it:

do this once, on form_load or something:

pictureBox1.Image = new Bitmap(Width, Height);

to draw:

Graphics.FromImage(pictureBox1.Image).FillRectangle(Brushes.Black, 0, 0, 100, 100);
pictureBox1.Refresh();
查看更多
我欲成王,谁敢阻挡
6楼-- · 2019-02-25 14:12

You need to do all of your drawing in the Paint event, which fires each time your control gets repainted.

查看更多
登录 后发表回答