这是在表单上绘制图像的最佳方法吗?我大部分的经验都是在Java方面,很少在VB.net方面。在Java中,有可以调用的called ()吗?有一个Me.refresh()。这是当您需要在窗体上添加一些内容或在窗体上绘制时调用的内容吗?
类:
Public Class Form1
Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Create image.
Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
' Create Point for upper-left corner of image.
Dim ulCorner As New Point(50, 50)
' Draw image to screen.
e.Graphics.DrawImage(newImage, ulCorner)
Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
' Create Point for upper-left corner of image.
Dim ulCorner2 As New Point(150, 150)
' Draw image to screen.
e.Graphics.DrawImage(newImage2, ulCorner2)
End Sub
End Class我在这里尝试了下面的代码,表单上有一个按钮,其中有一个单击事件。
Public Class Form1
Dim i As Integer
Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
i = 0
' Create image.
Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
' Create Point for upper-left corner of image.
Dim ulCorner As New Point(50, 50)
' Draw image to screen.
e.Graphics.DrawImage(newImage, ulCorner)
Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
' Create Point for upper-left corner of image.
Dim ulCorner2 As New Point(150, 150)
' Draw image to screen.
e.Graphics.DrawImage(newImage2, ulCorner2)
If i = 5 Then
' Create image.
Dim newImage3 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
' Create Point for upper-left corner of image.
Dim ulCorner3 As New Point(250, 250)
' Draw image to screen.
e.Graphics.DrawImage(newImage3, ulCorner3)
End If
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
i = 5
Me.Refresh()
End Sub
End Class刚刚在这里尝试了这段代码:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
i = 5
Me.Invalidate()
End Sub新班刚刚测试:
Public Class Form2
Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
Dim newImage3 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
Private bgImage As Bitmap
Private srcImages As Image()
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
Dim img As Bitmap = Me.bgImage
If (img Is Nothing) Then
Me.bgImage = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
img = Me.bgImage
End If
If (Not Me.srcImages Is Nothing) Then
End If
MyBase.OnPaint(e)
End Sub
Private Sub _Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.srcImages = New Image(3 - 1) {}
Me.srcImages(0) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
Me.srcImages(1) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
Me.srcImages(2) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif")
End Sub
Private Sub _Disposed(sender As Object, e As EventArgs) Handles MyBase.Disposed
If (Not Me.srcImages Is Nothing) Then
For Each img As Image In Me.srcImages
If (Not img Is Nothing) Then
img.Dispose()
End If
Next
Me.srcImages = Nothing
End If
If (Not Me.bgImage Is Nothing) Then
Me.bgImage.Dispose()
Me.bgImage = Nothing
End If
End Sub
Private Sub _Resize(sender As Object, e As EventArgs) Handles MyBase.SizeChanged, MyBase.Resize
If (Not Me.bgImage Is Nothing) Then
Me.bgImage.Dispose()
Me.bgImage = Nothing
End If
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Me.Invalidate()
End Sub
End Class发布于 2013-12-17 16:12:24
调用Me.Invalidate()将使控件的整个图面无效,并导致重新绘制控件。
我还建议您不要在每个油漆周期加载您的图像。您可以在窗体加载事件中加载源图像,并在窗体处理时销毁它们。
Public Class Form1
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
Dim img As Bitmap = Me.bgImage
If (img Is Nothing) Then
Me.bgImage = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
img = Me.bgImage
End If
'TODO: Draw and paint.
If (Not Me.srcImages Is Nothing) Then
End If
MyBase.OnPaint(e)
End Sub
Private Sub _Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.srcImages = New Image(3 - 1) {}
Me.srcImages(0) = Image.FromFile("...")
Me.srcImages(1) = Image.FromFile("...")
Me.srcImages(2) = Image.FromFile("...")
End Sub
Private Sub _Disposed(sender As Object, e As EventArgs) Handles MyBase.Disposed
If (Not Me.srcImages Is Nothing) Then
For Each img As Image In Me.srcImages
If (Not img Is Nothing) Then
img.Dispose()
End If
Next
Me.srcImages = Nothing
End If
If (Not Me.bgImage Is Nothing) Then
Me.bgImage.Dispose()
Me.bgImage = Nothing
End If
End Sub
Private Sub _Resize(sender As Object, e As EventArgs) Handles MyBase.SizeChanged, MyBase.Resize
If (Not Me.bgImage Is Nothing) Then
Me.bgImage.Dispose()
Me.bgImage = Nothing
End If
End Sub
Private bgImage As Bitmap
Private srcImages As Image()
End Class发布于 2013-12-17 16:32:29
第一个片段显示没有任何需要帮助的证据。state事件处理程序中的任何内容都不取决于类的状态,因此没有理由强制重新绘制。默认绘画已经足够好了。
第二个片段通过人工的i变量来实现。在这种情况下,您总是调用Me.Invalidate(),将表单的整个客户端区域标记为需要重新绘制。当不需要做任何更重要的事情时,UI最终会得到一个画图事件。使用Me.Refresh()也是有效的,但它是沉重的,它是非常罕见的需要它。我想不出一个好例子。
请注意,无效()有一些重载,您可以标记窗口的一部分,以要求重新绘制。这是一个优化,使绘画更有效率。
正如所写的,您的程序在使用了一段时间后可能会崩溃。您必须调用加载的映像的must ()方法。看看使用语句的VB.NET。你会想要预加载图像,这样它就不会在绘画时发生,也不会重复发生。遵循Winforms编程教程或书籍是非常推荐的,以避免这种陷阱。
https://stackoverflow.com/questions/20638943
复制相似问题