2009-02-15 7 views
1

J'ai écrit une application Windows Forms pour résoudre les puzzles Shikaku. À l'heure actuelle, la grille de puzzle est dessinée sur un panneau dans la fenêtre principale de l'application en utilisant un PaintEventHandler. La méthode appelée par PaintEventHandler redessine la grille entière à chaque fois qu'elle est appelée. Bien que cette approche fonctionne, c'est flickery et inefficace, et je voudrais le remplacer par quelque chose de plus lisse.Existe-t-il un analogue à QCanvas de Qt dans Windows Forms?

J'ai écrit un certain nombre d'applications similaires dans Qt. Avec Qt, je créerais un QCanvas et un QCanvasView. Je peux ensuite ajouter des objets au QCanvas ou en retirer des objets et appeler la méthode update() sur QCanvasView pour voir les changements prendre effet sans scintillement.

Une approche alternative que j'ai essayée était de garder une référence à l'objet Graphics utilisé pour peindre le panneau et essayer de dessiner dessus en dehors d'un événement Paint. Cela n'a pas fonctionné: j'ai obtenu une exception plutôt inutile ArgumentException: Parameter is not valid, que je peux seulement supposer avoir été lancée par Windows parce qu'elle ne s'attendait pas à ce que l'application fasse de la peinture à ce moment-là.

Existe-t-il quelque chose de similaire à un QCanvas pour Windows Forms? Si non, quelle approche dois-je utiliser pour mettre à jour la grille de puzzle?

Répondre

1

L'événement Paint des contrôles WindowsForms comporte généralement une région de contexte définie pour redessiner uniquement les parties du contrôle qui sont nécessaires. Ceci, combiné avec la définition de DoubleBuffered à true est généralement suffisant pour la plupart des problèmes de repeindre.

En outre, vous obtenez l'exception car l'objet Graphics que vous mettez en cache est éliminé lorsque l'événement paint est terminé. Une approche viable, en supposant que DoubleBuffering ne soit pas suffisante, consiste à faire votre dessin sur un écran hors écran Bitmap lorsque vous peignez à l'écran dans votre événement Paint. Ou, hébergez le bitmap dans un PictureBox et laissez le redessiner se produire automatiquement.

+0

Merci pour votre réponse utile, vous m'avez donné quelques idées à explorer. Je prendrai un autre coup d'oeil plus tard cette semaine et j'accepterai votre réponse si tout fonctionne :). –

+0

J'utilise maintenant DoubleBuffered et je restreigne la zone de redessin au rectangle du clip dans l'événement Paint, et cela fonctionne beaucoup mieux maintenant. C'est un peu plus de travail qu'avec Qt. Cela me rappelle aussi écrire le code de redessiner la fenêtre dans RISC OS - les jours heureux! :) Merci encore. –

0

une pensée v.quick - qu'en est-il essayer PyQt? le QCanvas et un QCanvasView devraient fonctionner correctement sur n'importe quelle plate-forme

+0

J'utilise déjà PyQt. En fait, c'est ce que j'ai fait avec toute ma programmation Qt! Le but de cet exercice, cependant, était d'apprendre Windows Forms, donc utiliser PyQt aurait été auto-destructeur. –

+0

OK, cool - c'était juste une idée. Tout le meilleur pour vous et bonne chance avec le projet Shikaku. – Geddes