способ сделать это, чтобы создать DrawAction
класс, который содержит все данные, необходимые для того, что вы хотите сделать: данные Point
, то Pen
или Brush
и т.д.
Затем создать и управлять List<DrawAction> drawActions
, а затем у вас есть выбор:
Вы либо сделать все рисунок «живой» в Paint
случае PictureBox
или Panel
(или любой управление с Paint
события), обернув по списку ..
..Or добавить новые действия вBitmap Image
вы строят.
От чего лучше зависит: вы ожидаете сделать динамический рисунок, скажем, действиями пользователя? Вы хотите вариант отмены/повтора? Затем живым рисунком на поверхность управления немного лучше подходит.
Или список вещей, которые нужно сделать фиксированным или получить из фиксированного набора данных и предназначенный для сохранения на диске. Это похоже на рисунок на растровое изображение.
Оба могут быть объединены, возможно собрать ряд действий, сохраняя при этом возможность отмен (путем удаления последнего элемента списка) и предлагая кнопку Применить, чтобы накачать их в растровое изображение ..
Примечание: Ключ к материалу рисунка должен быть сохранить данные чертежа в списке, чтобы вы могли использовать его, когда вам это нужно, развернуть и удалить список и даже изменить его: было бы простым двухстрочным слоем все действия и изменить Color
или Width
или LineStyle
Pen
или смещать Points
немного и т. д. и т. д.!
Когда вы создаете класс DrawAction
, это помогает, если вы можете решить, какие действия вам понадобятся. Если вы не можете вы все еще можете пойти для более расширенного класса с достаточно членами, чтобы работать со всеми многими опциями Graphics
класса предлагает: Drawxx
, Fillxxx
, Pen
свойства, Colors
возможно даже Увеличение масштаба ..
Для стартеров типа А , List<Point>
float PenWidth
и Color
будет делать ..
Вот пример с простым классом, Paint
события, код, чтобы добавить несколько тестовых воздействий и both
:
- Кнопка для живого рисования и ...
- ..это применить действие для применения действий к растровому изображению
Image
PictureBox
.
Данные испытаний - один 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));
}
Результат для обоих выглядит одинаково:
Я вижу , Я уже пробовал это, используя условия 'if' внутри создания bmp, но это немного глупо, мне придется реплицировать этот оригинальный BMP не менее 5 раз и просто нужно добавить несколько стрелок. Изменить: мне нужно каким-то образом получить доступ к bmp после создания – ng80092b
Я не знаю, где вы называете «draws()», но вы должны иметь возможность передать BMP в функцию, чтобы иметь ссылку на BMP, который вы хотите edit 'draws (Bitmap bmp) {/ * ваш код здесь * /}' – Johan