Question

Imaginez que vous souhaitiez animer un objet sur un WinForm.Vous configurez une minuterie pour mettre à jour l'état ou le modèle et remplacez l'événement paint du formulaire.Mais à partir de là, quelle est la meilleure façon de repeindre continuellement le formulaire pour l'animation ?

  • Invalider le formulaire dès que vous avez fini de dessiner ?
  • Configurer un deuxième minuteur et invalider le formulaire à intervalles réguliers ?
  • Peut-être y a-t-il un modèle commun pour cette chose ?
  • Existe-t-il des classes .NET utiles pour vous aider ?

Chaque fois que je dois le faire, je découvre une nouvelle méthode avec un nouvel inconvénient.Quelles sont les expériences et recommandations de la communauté SO ?

Était-ce utile?

La solution

Dans certaines situations, il est plus rapide et plus pratique de ne pas dessiner à l'aide de l'événement paint, mais d'obtenir l'objet Graphics à partir du contrôle/formulaire et de peindre "sur" celui-ci.Cela peut poser quelques problèmes d'opacité/anticrénelage/texte, etc., mais cela pourrait en valoir la peine car il ne sera pas nécessaire de repeindre tout le shabang.Quelque chose du genre :

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

Je l'utilise moi-même dans certains contrôles et j'ai mis des images en mémoire tampon pour "effacer" l'arrière-plan lorsque l'objet d'intérêt bouge ou doit être supprimé.

Autres conseils

J'ai créé une bibliothèque qui pourrait vous aider.Il s'appelle Transitions et peut être trouvé ici : http://code.google.com/p/dot-net-transitions/

Il utilise des minuteries exécutées sur un thread d’arrière-plan pour animer les objets.La bibliothèque est open source, donc si cela vous est utile, vous pouvez consulter le code pour voir ce qu'elle fait.

Ce que vous faites est la seule solution que j'ai jamais utilisée dans WinForms (une minuterie avec des redessins constants).Il existe de nombreuses techniques que vous pouvez utiliser pour rendre l'expérience de l'utilisateur plus fluide (telle que le double tampon).

Vous voudrez peut-être essayer WPF.Il existe des fonctionnalités intégrées pour réaliser des animations dans WPF, et elles sont beaucoup plus fluides (et nécessitent moins de code et aucune synchronisation de votre part) qu'une solution basée sur un minuteur.

Notez que vous n'avez pas besoin d'utiliser WPF dans l'ensemble de votre application pour cette solution ;il est possible d'intégrer cette fonctionnalité dans un contrôle WPF et d'intégrer le contrôle dans une application WinForms (ou une application non gérée, d'ailleurs) :

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top