2010-12-08 65 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))