Drawing Graphics Disappear in VB.net

后端 未结 4 1409
后悔当初
后悔当初 2021-01-21 03:39

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 scre

相关标签:
4条回答
  • 2021-01-21 04:08

    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();
    
    0 讨论(0)
  • 2021-01-21 04:15

    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
    
    0 讨论(0)
  • 2021-01-21 04:23

    @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 your painting using the Graphics instance that is passed into the method. Here is more information on the topic:

    • How to use the CreateGraphics method
    • CreateGraphics. A boon or a curse?
    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        e.Graphics.FillEllipse(Brushes.Red, Me.ClientRectangle)
    
    End Sub
    
    0 讨论(0)
  • 2021-01-21 04:28

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

    0 讨论(0)
提交回复
热议问题