Как клонировать графику в C #? - PullRequest
1 голос
/ 08 декабря 2010

Я хочу предоставить различным частям приложения независимые экземпляры Graphics, которые в конечном итоге будут рисовать на одной и той же базовой графике. Простое клонирование графики работает, но поскольку оба экземпляра ссылаются на один и тот же дескриптор GDI, они не являются независимыми. Я также не могу использовать Begin и EndContainer, так как у меня есть метод, который должен предоставлять новые экземпляры Graphics. -так я не могу определить, когда вызывать EndContainer. Вариант использования очень похож на метод Graphics.create () в Java.

Я нашел некоторые обходные пути, но ни один из них не работает для графики, предоставляемой PrintController.

Можно ли использовать прокси-графику? Или есть возможность создать другую графику для того же устройства, например?

Ответы [ 5 ]

3 голосов
/ 08 декабря 2010

Звучит плохо. не хранит ссылки на объект Graphics, он только временно живет и действует только во время работы обработчика событий Paint или PrintPage.Обязательно передайте его в качестве аргумента любому методу, выполняющему рисование, вместо того, чтобы сохранять его в поле или глобальной переменной.

Если метод изменяет состояние объекта, используйте Save () иМетоды Restore (), чтобы предотвратить возникновение проблем в последующих методах, которые используют тот же объект.При таком подходе клонирование никогда не требуется.

1 голос
/ 08 декабря 2010

Графические объекты не предназначены для сохранения.Вы можете использовать подход с использованием буфера буфера, рисуя в растровое изображение перед вашим окончательным рендерингом.

Возможно, вы могли бы вызвать событие, на которое могли бы подписаться прослушивающие компоненты рисования, и ваш вызывающий код мог бы связать их вместе.Таким образом, вы можете использовать один и тот же экземпляр Graphics без ущерба для эффективности GDI.

0 голосов
/ 17 ноября 2016

Я столкнулся с той же проблемой, я нашел единственное решение - дублировать строку кода чертежей !!

Вроде следующего:

 e.Graphics.DrawString(points(i).pointText, myFont, Brushes.Blue, New Point(points(i).crossPointX4, points(i).crossPointY4)) : G.DrawString(points(i).pointText, myFont, Brushes.Blue, New Point(points(i).crossPointX4, points(i).crossPointY4))
0 голосов
/ 08 декабря 2010

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

Но что я не понимаю, так это то, что если все графические экземпляры должны рисовать для одной и той же цели, зачем вам сначала нужно несколько графических объектов?

0 голосов
/ 08 декабря 2010

Не уверен, что именно вы пытаетесь сделать, но вы можете использовать CreateGraphics() на Control или Graphics.FromImage(xx), чтобы создать новый графический объект для элемента управления и / или изображения.В Graphics.FromXXX

есть еще несколько функций
...