Graphics.Save与Graphics.BeginContainer有何不同
发布于 2009-11-30 20:43:58
看一看here
文档没有区分对BeginContainer/EndContainer的调用和对Graphics.Save和GraphicsRestore的调用。此外,文档中还存在一些错误。例如,错误地断言要由BeginContainer使用GraphicsState
在我的使用中,BeginContainer/EndContainer似乎可以保存和恢复当前的转换。它实际上不会像文档断言的那样保存剪切区域,并且它可能不会保存图形对象中的任何其他属性。
使用Save/Restore,我实际上能够保存/恢复裁剪区域、当前变换和其他设置。它看起来比容器函数更“完整”。因此,我怀疑这两种不同方法的性能/完整性权衡。
我还怀疑文档中关于GraphicsState对象(由Save使用)和GraphicsContainer对象(由BeginContainer使用)存储在堆栈中的说法是否正确。我怀疑GraphicsState可能甚至不会放在堆栈上,但我还没有测试过这个假设。
发布于 2015-02-21 21:22:52
也许我可以从MSDN的一些例子中给出一个解释。我的MSDN版本是Visual Studio2008 SP1。在MSDN的编辑中输入关键字“嵌套图形容器”即可找到示例。
它的解释如下:
正如前面两个示例所示,转换和裁剪区域在嵌套容器中是累积的。如果设置容器和Graphics对象的世界变换,则这两个变换都将应用于从容器内部绘制的项。首先应用容器的转换,然后应用Graphics对象的转换。如果设置容器和Graphics对象的剪切区域,则从容器内部绘制的项目将由这两个剪切区域的交集进行剪切。
从上面复制的内容来看,关键字是“累积”和“交集”。因此,我认为这可以成为理解BeginContainer函数的一种方式。
发布于 2009-11-30 18:51:50
Graphics.Save Method保存此图形的当前状态,并使用GraphicsState标识保存的状态。
Graphics.BeginContainer Method使用此图形对象的当前状态保存图形容器,然后打开并使用新的图形容器。
备注
对BeginContainer方法的调用将信息块置于与对Save方法的调用相同的堆栈中。正如还原调用与保存调用配对一样,EndContainer方法调用也与BeginContainer方法调用配对。
调用Restore方法时,在相应调用Save方法之后放置在堆栈上的所有信息块(通过Save方法或BeginContainer方法)都将从堆栈中删除。同样,当您调用EndContainer方法时,在相应的BeginContainer方法调用之后放置在堆栈上的所有信息块(通过Save方法或由BeginContainer方法)都将从堆栈中删除。
查看有关http://msdn.microsoft.com/en-us/library/system.drawing.graphics.save.aspx的详细信息
https://stackoverflow.com/questions/1320689
复制相似问题