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.

Полная статья MSDN доступна здесь.

Метод 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

Другие вопросы по тегам