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
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();
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
@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:
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.FillEllipse(Brushes.Red, Me.ClientRectangle)
End Sub
You need to do all of your drawing in the Paint
event, which fires each time your control gets repainted.