Graphics.Save 与 Graphics.BeginContainer

问题描述 投票:0回答:4

Graphics.Save
Graphics.BeginContainer
有什么不同?

.net graphics gdi+
4个回答
5
投票

看一下这里

文档中没有 区分调用 BeginContainer/EndContainer 和调用 到 Graphics.Save 和 GraphicsRestore。 此外,还有一些错误 文档。 [例如。, GraphicsState 断言不正确 由 BeginContainer 使用]

在我的使用中,BeginContainer/EndContainer 似乎 保存并恢复当前 转换。它实际上并没有保存 剪切区域为 文档断言,它可能不是 将任何其他属性保存在 图形对象。

通过保存/恢复,我实际上能够保存/恢复剪辑 区域、电流变换等 设置。看来是,如果不是的话 完整的,比 容器功能。因此,我 怀疑性能/完整性 与两个不同的权衡 方法。

我也怀疑文档中的说法是否正确 GraphicsState 对象(由 Save)按原样存储在堆栈中 GraphicsContainer 对象(由 开始容器)。我怀疑 GraphicsState 甚至可能无法放置 在堆栈上,但我还没有测试过这个 假设。


1
投票

也许我可以从MSDN的一些例子给出解释。我的MSDN版本是Visual Studio 2008 SP1。在MSDN的编辑中输入关键字“Nested Graphics Containers”就可以找到示例。

其解释如下:

如前面两个示例所示,变换和剪切区域在嵌套容器中是累积的。如果您设置容器和 Graphics 对象的世界变换,则这两种变换都将应用于从容器内部绘制的项目。首先应用容器的变换,然后应用 Graphics 对象的变换。如果设置容器和 Graphics 对象的剪切区域,从容器内部绘制的项目将被两个剪切区域的交集剪切。

从上面复制的内容来看,关键词是“累计”和“交集”。因此,我认为这可以成为理解BeginContainer函数的一种方式。

完整的 MSDN 文章可在此处获取。


0
投票

图形.保存方法 保存此 Graphics 的当前状态并使用 GraphicsState 标识保存的状态。

Graphics.BeginContainer 方法 使用此 Graphics 对象的当前状态保存图形容器,并打开并使用新的图形容器。

备注

调用 BeginContainer 方法会将信息块放置在与调用 Save 方法相同的堆栈上。正如 Restore 调用与 Save 调用配对一样,EndContainer 方法调用与 BeginContainer 方法调用配对。

当您调用 Restore 方法时,在相应调用 Save 方法之后放置在堆栈上(通过 Save 方法或通过 BeginContainer 方法)的所有信息块都会从堆栈中删除。同样,当您调用 EndContainer 方法时,在相应调用 BeginContainer 方法之后放置在堆栈上的所有信息块(通过 Save 方法或通过 BeginContainer 方法)都会从堆栈中删除。

详情请参阅 http://msdn.microsoft.com/en-us/library/system.drawing.graphics.save.aspx


0
投票

BeginContainer()
Save()
之间的区别仅在于
BeginContainer()
将所有渲染属性重置为默认状态。

简单来说,

BeginContainer()
执行以下操作:

  • 在内部执行
    Save()
    以保存状态
  • 将所有渲染属性(TextRenderingHint、InterpolationMode、SmoothingMode 等)重置为默认状态。

您可以在文档的备注部分找到相关提示:

BeginContainer方法建立的图形状态包括 默认图形状态的渲染质量;任何 调用该方法时存在的渲染质量状态更改是 重置为默认值。

© www.soinside.com 2019 - 2024. All rights reserved.