首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET涂料法?

VB.NET涂料法?
EN

Stack Overflow用户
提问于 2013-12-17 16:03:58
回答 2查看 8.6K关注 0票数 2

这是在表单上绘制图像的最佳方法吗?我大部分的经验都是在Java方面,很少在VB.net方面。在Java中,有可以调用的called ()吗?有一个Me.refresh()。这是当您需要在窗体上添加一些内容或在窗体上绘制时调用的内容吗?

类:

代码语言:javascript
复制
    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

我在这里尝试了下面的代码,表单上有一个按钮,其中有一个单击事件。

代码语言:javascript
复制
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

刚刚在这里尝试了这段代码:

代码语言:javascript
复制
 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        i = 5
        Me.Invalidate()
 End Sub

新班刚刚测试:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 16:12:24

调用Me.Invalidate()将使控件的整个图面无效,并导致重新绘制控件。

我还建议您不要在每个油漆周期加载您的图像。您可以在窗体加载事件中加载源图像,并在窗体处理时销毁它们。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-12-17 16:32:29

第一个片段显示没有任何需要帮助的证据。state事件处理程序中的任何内容都不取决于类的状态,因此没有理由强制重新绘制。默认绘画已经足够好了。

第二个片段通过人工的i变量来实现。在这种情况下,您总是调用Me.Invalidate(),将表单的整个客户端区域标记为需要重新绘制。当不需要做任何更重要的事情时,UI最终会得到一个画图事件。使用Me.Refresh()也是有效的,但它是沉重的,它是非常罕见的需要它。我想不出一个好例子。

请注意,无效()有一些重载,您可以标记窗口的一部分,以要求重新绘制。这是一个优化,使绘画更有效率。

正如所写的,您的程序在使用了一段时间后可能会崩溃。您必须调用加载的映像的must ()方法。看看使用语句的VB.NET。你会想要预加载图像,这样它就不会在绘画时发生,也不会重复发生。遵循Winforms编程教程或书籍是非常推荐的,以避免这种陷阱。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20638943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档