【问题标题】:How to clone a Graphics in C#?如何在 C# 中克隆图形?
【发布时间】:2010-12-08 15:23:06
【问题描述】:

我想为应用程序的不同部分提供独立的 Graphics 实例,这些实例最终在同一个基础 Graphics 上进行绘制。只需克隆 Graphics 即可,但由于两个实例都引用相同的 GDI 句柄,因此并不独立。我也不能使用 Begin 和 EndContainer,因为我有一个必须提供新 Graphics 实例的方法。 - 所以我无法确定何时调用 EndContainer。用例与 Java 中的 Graphics.create() 方法非常相似。

我找到了一些解决方法,但它们都不适用于 PrintController 提供的 Graphics。

我可以使用任何代理图形吗?或者是否有可能为同一设备创建另一个图形?

【问题讨论】:

  • 您能否提供一些示例代码,以便我们有一个起点?谢谢。
  • 如果所有图形实例都应该绘制到同一个目标,为什么首先需要多个图形对象?
  • 对不起,还没有真正的代码。我需要的最佳方法可能是图形包装器,如果不再使用其中一个子级,它会自动调用恢复。所以我现在会尝试使用保存和恢复。

标签: c# graphics printing clone


【解决方案1】:

这听起来很糟糕。 存储对 Graphics 对象的引用,它只是暂时存在,并且仅在 Paint 或 PrintPage 事件处理程序运行时有效。请务必将其作为参数传递给执行绘图的任何方法,而不是将其存储在字段或全局变量中。

如果该方法正在改变对象的状态,则使用 Save() 和 Restore() 方法来防止这在使用同一对象的后续方法中引起问题。这种方法永远不需要克隆它。

【讨论】:

    【解决方案2】:

    图形对象不应该被持久化。您可以通过在最终渲染之前绘制位图来使用后缓冲方法。

    也许您可以引发一个监听绘图组件可以订阅的事件,而您的调用代码可以将这些链接在一起。这样您就可以在不影响 GDI 效率的情况下使用相同的 Graphics 实例。

    【讨论】:

      【解决方案3】:

      不确定您到底想做什么,但您可以在 ControlGraphics.FromImage(xx) 上使用 CreateGraphics() 为控件和/或图像创建一个新的 Graphics 对象。 Graphics.FromXXX中还有更多功能

      【讨论】:

        【解决方案4】:

        一种可能性是创建多个指向多个目标的图形对象,例如内存图像。完成后,将所有图像合二为一。

        但我不明白的是,如果所有图形实例都应该绘制到同一个目标,为什么首先需要多个图形对象?

        【讨论】:

        • 我也喜欢这种组合方式。
        【解决方案5】:

        我也遇到了同样的问题,我发现唯一的解决办法就是复制图纸代码行!!

        如下:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 2011-08-07
          • 2011-05-08
          • 2012-02-10
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          相关资源
          最近更新 更多