2015-02-25 2 views
1

Я создал это в методе рисованияОбновить рисунок без удаления предыдущей

private void draws() 
{ 
Bitmap bmp = new Bitmap(pictureBox17.Width, pictureBox17.Height); 
using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       //define area do pictureBox17 e preenche a branco 
       Brush brush = new SolidBrush(Color.White); 
       Rectangle area = new Rectangle(0, 0, pictureBox17.Width, pictureBox17.Height); 
       g.FillRectangle(brush, area); 
       //desenha as linhas do rectangulo 
       g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp); 
// some more lines 
} 
pictureBox17.Image = bmp; 
} 

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

draws(); 

А потом я хочу что-то добавить, какие-нибудь советы?

ответ

2

способ сделать это, чтобы создать DrawAction класс, который содержит все данные, необходимые для того, что вы хотите сделать: данные Point, то Pen или Brush и т.д.

Затем создать и управлять List<DrawAction> drawActions, а затем у вас есть выбор:

  • Вы либо сделать все рисунок «живой» в Paint случае PictureBox или Panel (или любой управление с Paint события), обернув по списку ..

  • ..Or добавить новые действия вBitmap Image вы строят.

От чего лучше зависит: вы ожидаете сделать динамический рисунок, скажем, действиями пользователя? Вы хотите вариант отмены/повтора? Затем живым рисунком на поверхность управления немного лучше подходит.

Или список вещей, которые нужно сделать фиксированным или получить из фиксированного набора данных и предназначенный для сохранения на диске. Это похоже на рисунок на растровое изображение.

Оба могут быть объединены, возможно собрать ряд действий, сохраняя при этом возможность отмен (путем удаления последнего элемента списка) и предлагая кнопку Применить, чтобы накачать их в растровое изображение ..

Примечание: Ключ к материалу рисунка должен быть сохранить данные чертежа в списке, чтобы вы могли использовать его, когда вам это нужно, развернуть и удалить список и даже изменить его: было бы простым двухстрочным слоем все действия и изменить Color или Width или LineStylePen или смещать Points немного и т. д. и т. д.!

Когда вы создаете класс DrawAction, это помогает, если вы можете решить, какие действия вам понадобятся. Если вы не можете вы все еще можете пойти для более расширенного класса с достаточно членами, чтобы работать со всеми многими опциями Graphics класса предлагает: Drawxx, Fillxxx, Pen свойства, Colors возможно даже Увеличение масштаба ..

Для стартеров типа А , List<Point>float PenWidth и Color будет делать ..

Вот пример с простым классом, Paint события, код, чтобы добавить несколько тестовых воздействий и both:

  • Кнопка для живого рисования и ...
  • ..это применить действие для применения действий к растровому изображению ImagePictureBox.

Данные испытаний - один Line и один комплект Polylines.

Вы должны начать улучшать его, указав Enum со всеми типами действий рисования, которые вы хотите использовать! Это будет намного лучше и легче понять тип типа cheapo, который я закодировал ;-) Типы могут включать Rectangle, FilledRectangle, Ellipse, FilledEllipse, Line, Lines, Polygon, FilledPolygon, Text, Curve, Curves, а затем некоторые. С немного больше вы можете также работать с изображением, GraphicsPath, сплайн .. И другие данные могут контролировать Rotation, Scaling, Gradients, Transparency и т.д ..

List<DrawAction> actions = new List<DrawAction>(); 

public class DrawAction 
{ 
    public char type { get; set; }    // this should be an Enum! 
    public Color color { get; set; }  
    public float penWidth { get; set; }  // only one of many Pen properties! 
    public List<Point> points { get; set; } // use PointF for more precision 

    public DrawAction(char type_, Color color_, float penwidth_) 
    { 
     type = type_; color = color_; penWidth = penwidth_; 
     points = new List<Point>(); 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Draw(e.Graphics, actions); 
} 


public void Draw(Graphics G, List<DrawAction> actions) 
{ 
    foreach (DrawAction da in actions) 
     if (da.type == 'L' && da.points.Count > 1) 
      using (Pen pen = new Pen(da.color, da.penWidth)) 
       G.DrawLine(pen, da.points[0], da.points[1]); 
     else if (da.type == 'P' && da.points.Count > 1) 
      using (Pen pen = new Pen(da.color, da.penWidth)) 
       G.DrawLines(pen, da.points.ToArray()); 
    // else.. 


} 

private void button1_Click(object sender, EventArgs e) 
{ 
    AddTestActions(); 
    pictureBox1.Invalidate(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    AddTestActions(); 
    Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width, 
          pictureBox1.ClientSize.Height); 
    using (Graphics G = Graphics.FromImage(bmp)) Draw(G, actions); 
    pictureBox1.Image = bmp; 
} 

void AddTestActions() 
{ 
    actions.Add(new DrawAction('L', Color.Blue, 3.3f)); 
    actions[0].points.Add(new Point(23, 34)); 
    actions[0].points.Add(new Point(23, 134)); 
    actions.Add(new DrawAction('P', Color.Red, 1.3f)); 
    actions[1].points.Add(new Point(11, 11)); 
    actions[1].points.Add(new Point(55, 11)); 
    actions[1].points.Add(new Point(55, 77)); 
    actions[1].points.Add(new Point(11, 77)); 
} 

Результат для обоих выглядит одинаково:

enter image description here

1

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

вы могли бы сделать что-то вроде

Bitmap bmp = new Bitmap(pictureBox17.Width, pictureBox17.Height); 
    private void draws() 
    { 
    if (bmp ==null) 
    using (Graphics g = Graphics.FromImage(bmp)) 
       { 
        //define area do pictureBox17 e preenche a branco 
        Brush brush = new SolidBrush(Color.White); 
        Rectangle area = new Rectangle(0, 0, pictureBox17.Width, pictureBox17.Height); 
        g.FillRectangle(brush, area); 
        //desenha as linhas do rectangulo 
        g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp); 
       } 
    else { 
     using (Graphics g = Graphics.FromImage(bmp)) 
     { 
      g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp); 
     } 
    // some more lines 
    } 
    pictureBox17.Image = bmp; 
    } 

Просто, чтобы вы начали .. :)

В качестве альтернативы вы можете передать ВМР в функцию дро, если вы используете этот метод, чтобы сделать несколько BMP в разное время

+0

Я вижу , Я уже пробовал это, используя условия 'if' внутри создания bmp, но это немного глупо, мне придется реплицировать этот оригинальный BMP не менее 5 раз и просто нужно добавить несколько стрелок. Изменить: мне нужно каким-то образом получить доступ к bmp после создания – ng80092b

+0

Я не знаю, где вы называете «draws()», но вы должны иметь возможность передать BMP в функцию, чтобы иметь ссылку на BMP, который вы хотите edit 'draws (Bitmap bmp) {/ * ваш код здесь * /}' – Johan

Смежные вопросы