【问题标题】:How to use a timer to change the contents of a picture box every 3 seconds如何使用计时器每 3 秒更改一次图片框的内容
【发布时间】:2021-01-10 19:19:23
【问题描述】:

我正在尝试制作一个精美的主屏幕,每 3 秒交替显示三张图片。我将如何做到这一点,如果可能的话,是否有可能让它们淡入淡出看起来更好一点?

这是我的代码:

Private Sub frmLoadUp_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim images As New List(Of Image)()
    images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\home pc.png"))
    images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\mid range pc.png"))
    images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\high end pc.png"))

    Dim pictureChangeTimer As New Timer()
    AddHandler pictureChangeTimer.Tick, AddressOf pictureChangeTimer_tick
    pictureChangeTimer.Interval = 3000
    pictureChangeTimer.Start()
End Sub


Private Sub pictureChangeTimer_tick(sender As Object, e As EventArgs)
    Index = (Index + 1) Mod images.Count()
    PictureBox1.Image = images(Index)
    PictureBox1.Image = Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\home pc.png")
    PictureBox1.Image = Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\mid range pc.png")
    PictureBox1.Image = Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\high end pc.png")

End Sub

【问题讨论】:

  • 制作动画 gif 可能更容易。
  • @braX 我正在使用 vb.net。我已将我当前的代码包含在已编辑的问题中。
  • @LukeCassidy 如果您的问题已经解决,请考虑accepting it

标签: vb.net visual-studio


【解决方案1】:

在 Form.Load 中填写您的列表,但使列表成为表单级别(类级别)变量,以便您可以从表单中的任何方法看到它。您可以在设计器中添加计时器并在那里设置其属性。图像将从索引 0 开始;整数初始化为零。

当您的计时器滴答作响时,我们会增加 Index(这也是一个表单级别的变量;它将在对方法的调用之间保持其值)。接下来我们检查我们是否已经到了列表的末尾,如果已经到了,则重置为零。

Private Index As Integer
Private images As New List(Of Image)()

Private Sub frmLoadUp_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\home pc.png"))
    images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\mid range pc.png"))
    images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\high end pc.png"))

    Dim pictureChangeTimer As New Timer()
    AddHandler pictureChangeTimer.Tick, AddressOf pictureChangeTimer_tick
    pictureChangeTimer.Interval = 3000
    PictureBox1.Image = images(Index)
    pictureChangeTimer.Start()
End Sub


Private Sub pictureChangeTimer_tick(sender As Object, e As EventArgs)
    Index += 1
    If Index > 2 Then 'There is no Index 3 so we start from the beginning again
        Index = 0
    End If
    PictureBox1.Image = Images(Index)
End Sub

【讨论】:

    【解决方案2】:

    您需要进行一些更改:

    (1) 在类级别声明图像 (2) 更改您的图片计时器以通过索引设置图像并重置索引

    Dim Images As New List(Of Image)()
    Dim Index as Integer
    
    Private Sub frmLoadUp_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        
        Images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\home pc.png"))
        Images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\mid range pc.png"))
        Images.Add(Image.FromFile("C:\Users\lukem\Desktop\TO COPY TO ONEDRIVE\PCs\high end pc.png"))
        Index = -1;
        Dim pictureChangeTimer As New Timer()
        AddHandler pictureChangeTimer.Tick, AddressOf pictureChangeTimer_tick
        pictureChangeTimer.Interval = 3000
        pictureChangeTimer.Start()
    End Sub
    
    
    Private Sub pictureChangeTimer_tick(sender As Object, e As EventArgs)
    
        Index = If(Index = 2, 0, Index + 1)
    
        PictureBox1.Image = Images(Index)  
    
    End Sub
    

    【讨论】:

    • 我收到一个错误,在“If(Index = 2, 0, Index + 1)”行上,它说“类型的值(布尔值,整数,整数)无法转换为布尔值。有解决办法吗?
    • 我认为您的代码不会编译。另外,您对索引 2 处的图像有什么看法?
    • 也许你的意思是:Index = If(Index = 2, 0, Index + 1)
    • @Mary 有三个图像(0、1、2)如果 index = 2 则索引应重置为零
    • @LukeCassidy - 抱歉,我遇到了一个小错误并更新了答案
    【解决方案3】:

    考虑使用ColorMatrix 来混合图像。

    首先,创建自定义图片框。(代码来自another question

    Imports System.Drawing.Imaging
    
    Public Class CustomPictureBox
    Inherits PictureBox
    
    Private mImg1 As Image
    Private mImg2 As Image
    Private mBlend As Single
    Public Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True)
    End Sub
    Public Property Image1 As Image
        Get
            Return mImg1
        End Get
        Set(ByVal value As Image)
            mImg1 = value
            Invalidate()
        End Set
    End Property
    
    Public Property Image2 As Image
        Get
            Return mImg2
        End Get
        Set(ByVal value As Image)
            mImg2 = value
            Invalidate()
        End Set
    End Property
    
    Public Property Blend As Single
        Get
            Return mBlend
        End Get
        Set(ByVal value As Single)
            mBlend = value
            Invalidate()
        End Set
    End Property
    
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        If mImg1 Is Nothing OrElse mImg2 Is Nothing Then
            e.Graphics.FillRectangle(New SolidBrush(Me.BackColor), New Rectangle(0, 0, Me.Width, Me.Height))
        Else
            Dim rc As Rectangle = New Rectangle(0, 0, Me.Width, Me.Height)
            Dim cm As ColorMatrix = New ColorMatrix()
            Dim ia As ImageAttributes = New ImageAttributes()
            cm.Matrix33 = mBlend
            ia.SetColorMatrix(cm)
            e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, mImg2.Height, GraphicsUnit.Pixel, ia)
            cm.Matrix33 = 1.0F - mBlend
            ia.SetColorMatrix(cm)
            e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, mImg1.Height, GraphicsUnit.Pixel, ia)
        End If
        MyBase.OnPaint(e)
    End Sub
    
    End Class
    

    然后将“CustomPictureBox”和“Timer”从 Toolbox 拖到表单中。

    最后,你可以参考下面的代码,每3秒改变一个图片框的内容。

    Private mBlend As Single
    Private mDir As Integer = 1
    Public index As Integer = 0
    Public Images As List(Of Image) = New List(Of Image)()
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Images.Add(New Bitmap("path of picture1"))
        Images.Add(New Bitmap("path of picture2"))
        Images.Add(New Bitmap("path of picture3"))
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Timer1.Interval = 60
        CustomPictureBox1.Image1 = Images(index)
        index += 1
        CustomPictureBox1.Image2 = Images(index)
        Timer1.Enabled = True
    End Sub
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        mBlend += mDir * 0.02F
        If mBlend > 1 Then
            mBlend = 0.0F
            If (index + 1) < Images.Count Then
                CustomPictureBox1.Image1 = Images(index)
                index += 1
                CustomPictureBox1.Image2 = Images(index)
            Else
                CustomPictureBox1.Image1 = Images(index)
                CustomPictureBox1.Image2 = Images(0)
                index = 0
            End If
        End If
        CustomPictureBox1.Blend = mBlend
    End Sub
    

    我的测试结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多