我有一个简单的程序,您可以使用FillEllipse和FillRectangle在屏幕上绘制。我的问题是,当您将另一个窗口拖过屏幕的一小部分时,该部分将被删除。将另一个窗口拖过,放开并将其拖回时会发生这种情况。有什么方法可以解决这个问题吗?
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
答案 0 :(得分:5)
你可以在你的表单上放置一个PictureBox控件,然后绘制它,当其他窗口涂在它上面时它不会被删除:
在form_load上执行此操作一次:
pictureBox1.Image = new Bitmap(Width, Height);
画画:
Graphics.FromImage(pictureBox1.Image).FillRectangle(Brushes.Black, 0, 0, 100, 100);
pictureBox1.Refresh();
答案 1 :(得分:4)
您需要在Paint
事件中完成所有绘图,每次重新绘制控件时都会触发。
答案 2 :(得分:1)
以下代码允许您使用鼠标绘制矩形(单击并拖动)。将PictureBox
添加到表单。
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
答案 3 :(得分:0)
@SLaks已经告诉过你在OnPaint方法中做所有绘画。这里有更多信息。如果您尝试在表单上绘图,则会覆盖OnPaint方法,并使用传递给方法的Graphics实例绘制所有绘图。以下是有关该主题的更多信息:
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
答案 4 :(得分:0)
只是一个洞察力,真正帮助我在vb.net中绘制的是这个例子vbnettuthut.blogspot.com它显示了一个完整的例子来绘制平滑和快速的工作示例和源代码