2010-12-08 35 views
1

Je souhaite fournir différentes parties d'une application avec des instances Graphics indépendantes qui finissent par peindre sur la même base Graphics. Le simple clonage des graphiques fonctionne, mais comme les deux instances font référence au même handle GDI, elles ne sont pas indépendantes. Je ne peux pas utiliser Begin et EndContainer car j'ai une méthode qui doit fournir les nouvelles instances de Graphics. Je ne peux donc pas déterminer quand appeler EndContainer. Le cas d'utilisation est assez similaire à la méthode Graphics.create() en Java.Comment cloner un graphique en C#?

J'ai trouvé quelques solutions de contournement, mais aucune ne fonctionne pour un graphique fourni par le PrintController.

Existe-t-il des graphiques proxy que je peux utiliser? Ou est-il possible de créer un autre graphique pour le même appareil par exemple?

+0

Pourriez-vous s'il vous plaît fournir un peu de code exemple afin que nous avons un point de départ? Je vous remercie. – GateKiller

+0

Si toutes les instances graphiques doivent peindre sur la même cible, pourquoi avez-vous besoin de plusieurs objets graphiques en premier lieu? – codymanix

+0

Je suis désolé, mais il n'y a pas encore de vrai code. La meilleure approche pour ce dont j'ai besoin pourrait être le wrapper Graphics, qui appelle automatiquement restore, si l'un de ses enfants n'est plus utilisé. Je vais donc essayer d'utiliser Sauvegarder et restaurer pour le moment. – tigger

Répondre

3

Cela semble mauvais. Do not stocker des références à un objet Graphics, il ne vit que temporairement et n'est valide que pendant l'exécution d'un gestionnaire d'événements Paint ou PrintPage. Assurez-vous de le passer comme argument à la méthode du dessin au lieu de le stocker dans un champ ou une variable globale.

Si la méthode modifie l'état de l'objet, utilisez les méthodes Save() et Restore() pour éviter que cela ne provoque des problèmes dans les méthodes suivantes utilisant ce même objet. Le clonage n'est jamais nécessaire avec cette approche.

0

Vous ne savez pas exactement ce que vous essayez de faire, mais vous pouvez utiliser CreateGraphics() sur un Control ou Graphics.FromImage(xx) pour créer un nouvel objet Graphics pour le contrôle et/ou l'image. Il y a aussi quelques autres fonctions dans Graphics.FromXXX

0

Une possibilité serait de créer plusieurs objets graphiques pointant vers plusieurs cibles, par exemple une image mémoire. Puis, après avoir terminé, combinez toutes les images en une seule.

Mais la chose que je ne comprends pas est, si toutes les instances graphiques doivent peindre à la même cible, pourquoi avez-vous besoin de plusieurs objets graphiques en premier lieu?

+0

J'aime cette approche de combinaison aussi. – Tom

1

Les objets graphiques ne sont pas destinés à être conservés. Vous pouvez utiliser une approche backbuffer en dessinant sur un bitmap avant votre rendu final.

Vous pourriez peut-être déclencher un événement auquel les composants de dessin à l'écoute pourraient s'abonner, et votre code d'appel pourrait les enchaîner. De cette façon, vous pouvez utiliser la même instance Graphics sans compromettre l'efficacité de GDI.

0

J'étais confronté au même problème, j'ai trouvé que la seule solution est de dupliquer la ligne de code des dessins !!

Comme les éléments suivants:

e.Graphics.DrawString(points(i).pointText, myFont, Brushes.Blue, New Point(points(i).crossPointX4, points(i).crossPointY4)) : G.DrawString(points(i).pointText, myFont, Brushes.Blue, New Point(points(i).crossPointX4, points(i).crossPointY4))