2008-08-14 42 views
19

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

  • Invalider le formulaire dès que vous avez fini de dessiner?
  • Configurer un deuxième temporisateur et invalider le formulaire sur un intervalle régulier?
  • Peut-être qu'il existe un modèle commun pour cette chose?
  • Y a-t-il des classes .NET utiles pour aider?

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

Répondre

9

Dans certaines situations, il est plus rapide et plus pratique de ne pas tirer en utilisant l'événement paint, mais en récupérant l'objet Graphics du control/form et en le peignant "on". Cela peut donner quelques problèmes avec l'opacité/anti aliasing/texte etc, mais pourrait en valoir la peine en termes de ne pas avoir à repeindre tout le shabang. Quelque chose le long des lignes de:

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++])); 
} 

J'utiliser dans certains contrôles moi-même, et avoir des images en mémoire tampon à « clair » avec l'arrière-plan, lorsque l'objet de mouvements d'intérêt ou doivent être enlevés.

+0

N'est-il pas mieux fait avec la classe BufferedGraphics? –

+0

Je parie que c'est! Je ne l'ai jamais utilisé cependant. – Peteter

3

Ce que vous faites est la seule solution que j'ai jamais utilisée dans WinForms (une minuterie avec des retraits constants). Il existe un tas de techniques que vous pouvez utiliser pour rendre l'expérience de l'utilisateur plus fluide (comme la double-mise en mémoire tampon).

Vous pouvez essayer WPF. Il y a des fonctionnalités intégrées pour faire des animations dans WPF, et elles sont beaucoup plus fluides (et nécessitent moins de code et pas de synchronisation de votre part) qu'une solution basée sur un timer.

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

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

44

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

Il utilise des temporisateurs s'exécutant sur un fil d'arrière-plan pour animer les objets. La bibliothèque est open-source, donc si cela vous est utile, vous pouvez regarder le code pour voir ce qu'il fait.

+1

Superbe bibliothèque. Bien fait et fonctionne très bien. –

+1

Génial bibliothèque, j'adore ça. Me rappelle de JQuery.UI – Malfist

+0

Pourquoi n'est-ce pas sur Nuget! –