Порядок выполнения системы.Рисование.Список на основе графики

#c# #list #action #system.drawing.graphics

#c# #Список #Экшен #system.drawing.graphics

Вопрос:

Я публикую здесь впервые, поэтому заранее приношу извинения, если у меня неправильное форматирование кода. Я кодирую простой класс визуализации GDI на C #. Вот упрощенная версия моего кода:

 public interface IRenderer
{
    void Begin();
    void ClearFrame(byte R, byte G, byte B);
    byte[] End();

}

public class RendererGDI : IRenderer
{
    List<Action> renderFunctions;
    Bitmap b = new Bitmap(256,256);
    Graphics g = Graphics.FromImage(b);

    public RendererGDI()
    {
        renderFunctions = new List<Action>();
    }

    void Begin()
    {
        renderFunctions.Clear();
    }

    void ClearFrame(byte R, byte G, byte B)
    {           
        renderFunctions.Add(() => g.Clear(Color.FromArgb(255, R,G,B)));
    }

    byte[] End()
    {
        foreach (Action func in renderFunctions)
            func();
    }
}
  

Функция End () еще не полностью реализована, но мне интересно, правильный ли это способ хранения System.Рисование.Графические операции и только они выполняются внутри функции End()?

Большое спасибо за ваше время и помощь.

Крейг.

Комментарии:

1. Да, это сработало бы, просто не забудьте реализовать шаблон IDisposable или очистить все ваши ресурсы в методе end.

2. Потрясающе! Большое вам спасибо!

3. Вы всегда будете рисовать на 256x256 растровом изображении? В смысле, что там делает это предварительно созданное растровое изображение в виде поля? У вас должны быть средства для наследования графического объекта из источника, неизвестного до времени выполнения. Или предоставьте конструктор / метод / свойство, которое задает графический объект или растровое изображение, или создает его с использованием некоторых параметров. Список действий используется довольно часто при рисовании фигур или других последовательностей графических объектов, вам просто нужно сделать свой класс более универсальным .

4. @CraigBerry Рассмотрите возможность использования Action<Graphics> в качестве подписи для функции визуализации: List<Action<Graphics>> renderFunctions . Затем вы могли бы передать частный Graphics экземпляр класса при вызове его внутри End() функции, сделав Graphics экземпляр доступным для использования в функциях рендеринга.

5. Оба предложения фантастические. Да, растровое изображение размером 256×256 было добавлено туда просто для краткого примера. Сейчас я вношу рекомендуемые изменения. Еще раз спасибо, ребята!