2010-12-08 8 views
1

アプリケーションのさまざまな部分に独立したGraphicsインスタンスを提供して、同じベースグラフィックスでペイントしたいと思っています。単にGraphicsを複製するだけですが、両方のインスタンスが同じGDIハンドルを参照するため、独立していません。新しいGraphicsインスタンスを提供するメソッドがあるので、BeginとEndContainerも使用できません。私はEndContainerを呼び出すタイミングを判断できません。このユースケースは、JavaのGraphics.create()メソッドと非常によく似ています。C#でグラフィックスをクローンするには?

私はいくつかの回避策を見つけましたが、どれもPrintControllerが提供するグラフィックスでは機能しません。

使用できるプロキシがありますか?あるいは、同じデバイスの別のグラフィックスを作成する可能性はありますか?

+0

我々は出発点を持っているように、あなたは、サンプルコードを少し提供していただけますか?ありがとうございました。 – GateKiller

+0

すべてのグラフィックスインスタンスが同じターゲットにペイントする必要がある場合、なぜ最初に複数のグラフィックスオブジェクトが必要ですか? – codymanix

+0

申し訳ありませんが、実際のコードはまだありません。私が必要とする最良のアプローチは、子どもの1人がもはや使用されていなければ、復元を自動的に呼び出すGraphicsラッパーかもしれません。だから私は今、保存と復元を使用しようとします。 – tigger

答えて

3

これは悪いですね。 ではなく、はGraphicsオブジェクトへの参照を格納します。一時的にしか存在せず、PaintまたはPrintPageイベントハンドラの実行中のみ有効です。フィールドまたはグローバル変数に格納するのではなく、描画を行うメソッドに引数として渡すようにしてください。

メソッドがオブジェクトの状態を変更している場合、Save()およびRestore()メソッドを使用して、同じオブジェクトを使用する後続のメソッドで問題が発生しないようにします。この方法でクローニングする必要は決してありません。

0

正確に何をしようとしているのかわかりませんが、ControlまたはGraphics.FromImage(xx)CreateGraphics()を使用すると、コントロールや画像用の新しいGraphicsオブジェクトを作成できます。さらにいくつかの機能がありますGraphics.FromXXX

0

複数のターゲット(たとえばメモリイメージ)を指し示す複数のグラフィックスオブジェクトを作成する可能性があります。その後、すべての画像を1つにまとめる。

しかし、私が理解していないことは、すべてのグラフィックスインスタンスが同じターゲットにペイントする必要がある場合、なぜ最初に複数のグラフィックスオブジェクトが必要なのでしょうか?

+0

私はそのようなアプローチも好きです。 – Tom

1

グラフィックスオブジェクトは永続化されていません。あなたは最終的なレンダリングの前にビットマップに描画することによってバックバッファー・アプローチを使用することができます。

おそらく、リッスンする図面コンポーネントが登録できるイベントを発生させる可能性があり、呼び出しコードがこれらを連鎖させる可能性があります。そうすれば、GDIの効率を損なうことなく同じGraphicsインスタンスを使用することができます。

0

私は同じ問題に直面していましたが、唯一の解決策は図面のコード行を複製することです!次のような

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)) 
関連する問題