VB.NET, .NET 4VB.NET Classe d'images animée qui utilise une minuterie pour avancer les images - est-ce une bonne approche?
Bonjour,
Je suis en train d'écrire un front-end de contrôle industriel qui a des graphiques « fantaisie » pour indiquer les états de certaines machines. Par exemple, j'indique que certains radiateurs sont allumés en montrant des flèches ondulées rouges émanant d'une image d'un radiateur. J'accompli cela en créant une classe qui hérite de PictureBox et à l'aide d'une minuterie pour faire avancer les images:
Public Class AnimatedPictureBox
Inherits PictureBox
Private WithEvents Timer As New Timers.Timer
Public Property Interval As Double
Get
Return Timer.Interval
End Get
Set(ByVal value As Double)
Timer.Interval = value
End Set
End Property
Public ImageList As New List(Of Image)
Private NextImageIndex As Integer = 0
Public Sub New(ByVal Interval As Integer)
MyBase.New()
Timer = New Timers.Timer
Me.Interval = Interval
Me.SizeMode = PictureBoxSizeMode.StretchImage
Me.Visible = True
End Sub
Public Sub New()
Me.New(100)
End Sub
Public Sub BeginAnimation(ByVal [Loop] As Boolean)
Timer.Start()
End Sub
Public Sub BeginAnimation()
BeginAnimation([Loop]:=True)
End Sub
Public Sub StopAnimation()
Timer.Stop()
End Sub
Private Sub Timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer.Elapsed
InvokeControl(Me, _
Sub(x)
x.Image = x.ImageList(NextImageIndex)
x.NextImageIndex += 1
If x.NextImageIndex > x.ImageList.Count - 1 Then x.NextImageIndex = 0
End Sub)
End Sub
End Class
Lorsque InvokeControl est un sous-programme dans un module qui gère triage contre-filetage de contrôle:
Private Sub InvokeControl(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
If Control.InvokeRequired Then
Try
Control.Invoke(New Action(Of T, Action(Of T))(AddressOf InvokeControl), New Object() {Control, Action})
Catch ex As Exception
'..Handle the error..
End Try
Else
Action(Control)
End If
End Sub
Ma question est "Est-ce une bonne façon d'y arriver ou y a-t-il une meilleure façon évidente?" Je ne suis pas très bon en programmation et je m'inquiète de voir plusieurs de ces objets avec leurs timers embarqués taxer le CPU. Toutes les suggestions seraient grandement appréciées!
Merci à l'avance, Brian
post-scriptum Je suis allé avec des GIF animés pour d'autres choses d'animation, mais ici, je voulais être capable de gérer des formats d'image qui peuvent gérer une plus grande palette qu'un GIF (si cela a du sens). En d'autres termes, lorsque j'ai essayé de sauvegarder certaines de mes animations en tant que GIF, la qualité de l'image a pris un coup inacceptable.
Je ne pense pas que vous ayez à vous soucier de plusieurs temporisateurs imposant le processeur. Ils ne font rien jusqu'à ce qu'ils déclenchent votre code. –