J'ai besoin de réaliser une animation rapide en C#/Windows Forms pour un affichage d'Halloween. Il s'agit simplement de quelques formes 2D se déplaçant sur un fond solide. Comme il s'agit d'un projet ponctuel et rapide, je realmente Je ne veux pas installer et apprendre un nouvel ensemble d'outils pour cela. (kits de développement DirectX, Silverlight, Flash, etc.) Je dois également l'installer sur plusieurs ordinateurs, donc tout ce qui dépasse le cadre .Net de base (2.0) serait une plaie.
Pour les outils, j'ai VS2k8, 25 ans d'expérience en développement, une brouette, une cape d'holocauste et environ 2 jours pour réaliser ce projet. Je n'ai pas fait d'animation depuis que j'ai utilisé l'assembleur sur mon Atari 130XE (hourra pour le feuilletage des pages et les graphiques des joueurs et des missiles !)
Conseils ? Voici quelques-unes des choses que j'aimerais savoir :
- Je peux dessiner sur n'importe quel widget vide (comme un panneau) en jouant avec son gestionnaire OnPaint, n'est-ce pas ? C'est ainsi que je dessinerais un widget personnalisé. Existe-t-il une meilleure technique que celle-ci ?
- Existe-t-il une technique de basculement de page pour ce genre de choses dans Windows Forms ? Je ne recherche pas une fréquence d'images élevée, mais le moins de scintillement/dessin possible.
Merci.
Post Mortem Edit ... "quelques jours de codage plus tard"
Eh bien, le projet est terminé. Les liens ci-dessous ont été utiles, bien que certains d'entre eux soient 404. (J'aimerais que SO permette de marquer "correct" plus d'une réponse). Le plus gros problème que j'ai dû surmonter était le scintillement, et un bug persistant lorsque j'ai essayé de dessiner directement sur le formulaire.
- Utiliser l'événement OnPaint pour le formulaire : mauvaise idée. Je n'ai jamais réussi à le faire fonctionner ; beaucoup d'erreurs mystérieuses (débordements de pile, ou ArgumentNullExceptions). J'ai fini par utiliser un panneau de la taille du formulaire et cela a bien fonctionné.
- L'utilisation de la méthode OnPaint est de toute façon lente. J'ai lu quelque part en ligne que la construction des PaintEventArgs était lente, et ils ne plaisantaient pas. Beaucoup de scintillements ont disparu lorsque j'ai abandonné cette méthode. Sautez la méthode OnPaint/Invalidate() et peignez vous-même.
-
Le paramétrage de toutes les options de "double buffering" sur le formulaire laissait encore un scintillement qui devait être corrigé. (Et j'ai trouvé des documents contradictoires qui disaient "définir les options sur le contrôle" et "définir les options sur le formulaire". Les contrôles n'ont pas de méthode .SetStyle()). Je n'ai pas testé sans eux, donc ils peuvent faire quelque chose (
this
est le formulaire) :this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Ainsi, la partie la plus importante du code ressemblait à ( pf
est la commande du panneau) :
void PaintPlayField()
{
Bitmap bufl = new Bitmap(pf.Width, pf.Height);
using (Graphics g = Graphics.FromImage(bufl))
{
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height));
DrawItems(g);
DrawMoreItems(g);
pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0);
}
}
Et je viens d'appeler PaintPlayField à l'intérieur de ma boucle Timer. Pas de scintillement du tout.