Graphics.Save vs Graphics.BeginContainer
Как Graphics.Save
отличный от Graphics.BeginContainer
?
3 ответа
Посмотрите здесь:
В документации не проводится различий между вызовами BeginContainer/EndContainer и вызовами Graphics.Save и GraphicsRestore. Кроме того, в документации есть несколько ошибок. [например, GraphicsState неправильно заявлен для использования BeginContainer]
В моем использовании, BeginContainer/EndContainer появляется для сохранения и восстановления текущего преобразования. На самом деле он не сохраняет область отсечения, как утверждает документация, и не может сохранять какие-либо другие свойства в графических объектах.
С помощью Save/Restore я смог сохранить / восстановить область отсечения, текущее преобразование и другие параметры. Похоже, что он, если не завершен, более "завершен", чем функции контейнера. Поэтому я подозреваю, что компромисс между производительностью и полнотой достигается двумя разными методами.
Я также сомневаюсь в правильности документации о том, что объекты GraphicsState (используемые Save) хранятся в стеке, как объекты GraphicsContainer (используемые BeginContainer). Я подозреваю, что GraphicsState может даже не помещаться в стек, но я не проверял эту гипотезу.
Я не даю вам решение, но вот несколько ссылок для вашей справки -
Документ графического контейнера http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-drawing/2252/BeginContainer-and-Save
РЕЗЮМЕ: Метод BeginContainer класса Graphics создает контейнер. Каждый метод BeginContainer связан с методом EndContainer. Вы также можете создавать вложенные контейнеры. Следующий фрагмент кода создает два контейнера. Вызов метода Save сохраняет объект GraphicsState как информационный блок в стеке и возвращает его.
Может быть, я могу дать объяснение на некоторых примерах MSDN. Версия моего MSDN - Visual Studio 2008 SP1. И примеры можно найти, когда вы вводите ключевое слово "Вложенные графические контейнеры" в редактировании MSDN.
И его объяснение ниже:
Как показывают два предыдущих примера, области преобразования и отсечения накапливаются во вложенных контейнерах. Если вы установите мировые преобразования контейнера и объекта Graphics, оба преобразования будут применяться к элементам, извлеченным из контейнера. Преобразование контейнера будет применено первым, а преобразование объекта Graphics будет применено вторым. Если вы установите области отсечения контейнера и объекта Graphics, элементы, извлеченные из контейнера, будут отсечены пересечением двух областей отсечения.
Из содержимого, скопированного выше, ключевыми словами являются "кумулятивный" и "пересечение". Поэтому я думаю, что это может быть способ понять функцию BeginContainer.
Метод Graphics.Save Сохраняет текущее состояние этой графики и идентифицирует сохраненное состояние с помощью GraphicsState.
Метод Graphics.BeginContainer Сохраняет графический контейнер с текущим состоянием этого графического объекта, открывает и использует новый графический контейнер.
замечания
Вызовы метода BeginContainer помещают информационные блоки в тот же стек, что и вызовы метода Save. Так же, как вызов Restore связан с вызовом Save, вызов метода EndContainer связан с вызовом метода BeginContainer.
Когда вы вызываете метод Restore, все информационные блоки, помещенные в стек (методом Save или методом BeginContainer) после соответствующего вызова метода Save, удаляются из стека. Аналогично, когда вы вызываете метод EndContainer, все информационные блоки, помещенные в стек (методом Save или методом BeginContainer) после соответствующего вызова метода BeginContainer, удаляются из стека.
Подробности см. На http://msdn.microsoft.com/en-us/library/system.drawing.graphics.save.aspx