2010-12-08 68 views
1

我想提供具有獨立圖形實例的應用程序的不同部分,最終在同一基本圖形上繪畫。只需克隆圖形工作,但由於兩個實例引用相同的GDI句柄,所以不存在獨立的。我不能使用Begin和EndContainer,因爲我有一個方法必須提供新的Graphics實例。所以我無法確定何時調用EndContainer。用例與Java中的Graphics.create()方法非常相似。如何在C#中克隆圖形?

我發現了一些解決方法,但它們都不適用於PrintController提供的圖形。

是否有任何代理圖形我可以使用?或者是否有可能爲同一設備創建另一個圖形?

+0

能否請您提供的樣本代碼一點點,使我們有一個起點?謝謝。 – GateKiller 2010-12-08 15:29:17

+0

如果所有圖形實例都應該繪製到相同的目標,爲什麼您首先需要多個圖形對象? – codymanix 2010-12-08 15:49:08

回答

3

這還有幾個功能這聽起來很糟糕。做不是存儲對Graphics對象的引用,它只是臨時存在,並且只在Paint或PrintPage事件處理程序運行時纔有效。確保將它作爲參數傳遞給繪圖的任何方法,而不是將其存儲在字段或全局變量中。

如果該方法正在改變對象的狀態,則使用Save()和Restore()方法來防止在使用同一對象的後續方法中導致此問題。克隆它從來沒有必要用這種方法。

0

不知道你正在嘗試做什麼,但你可以使用CreateGraphics()ControlGraphics.FromImage(xx)上爲控件和/或圖像創建一個新的Graphics對象。 Graphics.FromXXX

0

一種可能性是創建指向多個目標的多個圖形對象,例如內存圖像。然後完成後,將所有圖像合併成一個。

但我不明白的是,如果所有的圖形實例應該繪製到相同的目標爲什麼你需要多個圖形對象?

1

圖形對象不能被持久化。在最終渲染之前,您可以使用backbuffer方法繪製到位圖。

也許你可以提出一個事件,聽圖形組件可以訂閱,你的調用代碼可以將這些事件鏈接在一起。這樣,您可以使用相同的圖形實例而不影響GDI的效率。

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))