Graphics.Save vs Graphics.BeginContainer - PullRequest
       7

Graphics.Save vs Graphics.BeginContainer

8 голосов
/ 24 августа 2009

Чем Graphics.Save отличается от Graphics.BeginContainer?

Ответы [ 3 ]

4 голосов
/ 30 ноября 2009

посмотрите здесь :

Документация не различать призывы к BeginContainer / EndContainer и вызовы в Graphics.Save и GraphicsRestore. Кроме того, есть несколько ошибок в документация. [например., GraphicsState неправильно утвержден для использования BeginContainer]

В моем использовании BeginContainer / EndContainer отображается сохранить и восстановить текущий преобразования. Это на самом деле не сохраняет регион отсечения как документация утверждает, и это не может сохранить любые другие свойства в графические объекты.

С помощью команды «Сохранить / Восстановить» я смог сохранить / восстановить вырезку область, текущее преобразование и другие Настройки. Похоже, если нет полный, более "полный", чем контейнерные функции. следовательно, я подозреваю производительность / полноту компромисс с двумя разными методы.

Я также сомневаюсь в правильности документации объекты GraphicsState (используются Сохранить) хранятся в стеке как есть Объекты GraphicsContainer (используются BeginContainer). Я подозреваю что GraphicsState даже не может быть размещен в стеке, но я не проверял это гипотеза.

1 голос
/ 21 февраля 2015

Может быть, я могу дать объяснение на некоторых примерах MSDN. Версия моего MSDN - Visual Studio 2008 SP1. И примеры можно найти, когда вы вводите ключевое слово «Вложенные графические контейнеры» в редактировании MSDN.

И его объяснение ниже:

Как показывают два предыдущих примера, области преобразования и отсечения накапливаются во вложенных контейнерах. Если вы установите преобразования мира для контейнера и объекта Graphics, оба преобразования будут применяться к элементам, извлеченным из контейнера. Преобразование контейнера будет применено первым, а преобразование объекта Graphics будет применено вторым. Если вы установите области отсечения контейнера и объекта Graphics, элементы, извлеченные из контейнера, будут отсечены пересечением двух областей отсечения.

Из содержания, скопированного выше, ключевыми словами являются "кумулятивный" и "пересечение". Поэтому я думаю, что это может быть способ понять функцию BeginContainer.

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

0 голосов
/ 30 ноября 2009

Графика. Метод сохранения Сохраняет текущее состояние этой графики и идентифицирует сохраненное состояние с помощью GraphicsState.

Graphics.BeginContainer Method Сохраняет графический контейнер с текущим состоянием этого графического объекта, открывает и использует новый графический контейнер.

Примечания

Вызовы BeginContainer помещают информационные блоки в тот же стек, что и вызовы Save . Подобно тому, как вызов восстановления связан с вызовом Save , вызов метода EndContainer связан с вызовом метода BeginContainer .

Когда вы вызываете метод Restore , все информационные блоки, помещенные в стек (методом Save или методом BeginContainer ) после соответствующего вызова метода Save, удаляются из стека. Аналогично, когда вы вызываете метод EndContainer , все информационные блоки помещаются в стек (методом Save или методом BeginContainer ) после соответствующего вызова метод BeginContainer удаляется из стека.

Подробнее см. http://msdn.microsoft.com/en-us/library/system.drawing.graphics.save.aspx

...