2010-12-02 26 views
1

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.

+0

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. –

Répondre

1

Je pense que c'est une bonne approche. Les minuteurs vous donnent beaucoup de flexibilité et, comme l'a dit Mike, ils ne prendront pas le temps de parler du CPU.