Графический редактор с# windows forms

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyGraphicEditor
{
    public partial class Form1 : Form
    {
        Bitmap map;
        Pen[] pen;
        Pen pen1;
       // Pen pen = new Pen(Color.Black,3f);
        Graphics graphics;
        bool pen_mode;
        int cnt = 0;
        Point[][] p;
        bool mdown;
        String mode;
        bool point_focused;
        int catch_line_lindex;
        int catch_point_lindex;

        private class ArrayPoints
        {
            private int index = 0;
            private Point[] points;
            public ArrayPoints(int size)
            {
                if (size <= 0) size = 2;
                points = new Point[size];
            }
            public void setPoint(int x,int y)
            {
                if (index >= points.Length) index = 0;
                points[index] = new Point(x, y);
                index++;
            }
            public void resetPoints()
            {
                index = 0;
            }
            public int getCountPoints()
            {
                return index;
            }
            public Point[] GetPoints()
            {
                return points;
            }
        }

        private ArrayPoints arrayPoints;
        public Form1()
        {
            arrayPoints = new ArrayPoints(2);
            pen1 = new Pen(Color.Black, 3f);
            pen_mode = false;
            map = new Bitmap(100, 100);
            mode = "Рисуем линию";
            catch_line_lindex = -1;
            catch_point_lindex = -1;
            point_focused = false;
            mdown = false;
            InitializeComponent();
            setSize();
            p = new Point[100][];
            pen = new Pen[100];
            for (int i = 0; i < 100; i++)
            {
                p[i] = new Point[2];
                pen[i] = new Pen(Color.Black, 3f);
            }
                
        }
        
        private void setSize()
        {
            Rectangle rectangle = Screen.PrimaryScreen.Bounds;
            map = new Bitmap(rectangle.Width, rectangle.Height);
            graphics = Graphics.FromImage(map);
            for(int i = 0; i < cnt; i++)
            {
                pen[i].StartCap = System.Drawing.Drawing2D.LineCap.Round;
                pen[i].EndCap = System.Drawing.Drawing2D.LineCap.Round;
            }
            
           
        }
     
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {   
            mdown = false;
            if (pen_mode)
            {
                arrayPoints.resetPoints();
            }
            else {
                if (mode == "Рисуем линию")
                {
                    p[cnt][1].X = e.X;
                    p[cnt][1].Y = e.Y;
                    cnt++;
                }
                if (mode == "Изменяем линию")
                {
                    p[catch_line_lindex][catch_point_lindex].X = e.X;
                    p[catch_line_lindex][catch_point_lindex].Y = e.Y;
                }

                pictureBox1.Invalidate();
                mode = "Рисуем линию";
            }
            
        }
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            mdown = true;
            if (!pen_mode) {
                if (mode == "Рисуем линию")
                {
                    p[cnt][0].X = e.X;
                    p[cnt][0].Y = e.Y;
                }
                if (mode == "Изменяем линию")
                {
                    p[catch_line_lindex][catch_point_lindex].X = e.X;
                    p[catch_line_lindex][catch_point_lindex].Y = e.Y;
                }
            }
            


        }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (pen_mode)
            {
                if (!mdown) return;
                arrayPoints.setPoint(e.X, e.Y);
                if (arrayPoints.getCountPoints() >= 2)
                {
                    graphics.DrawLines(pen1,arrayPoints.GetPoints());
                    pictureBox1.Image = map;
                    arrayPoints.setPoint(e.X, e.Y);
                }
            }
            else
            {
                if (mdown)
                {
                    if (mode == "Рисуем линию")
                    {
                        p[cnt][1].X = e.X;
                        p[cnt][1].Y = e.Y;
                    }
                    if (mode == "Изменяем линию")
                    {
                        p[catch_line_lindex][catch_point_lindex].X = e.X;
                        p[catch_line_lindex][catch_point_lindex].Y = e.Y;
                    }
                }
                else
                {

                    mode = "Рисуем линию";
                    point_focused = false;
                    catch_point_lindex = -1;
                    catch_line_lindex = -1;
                    for (int i = 0; i < cnt; i++)
                    {
                        if (Math.Abs(p[i][0].X - e.X) < 5 && Math.Abs(p[i][0].Y - e.Y) < 5)
                        {
                            point_focused = true;
                            catch_point_lindex = 0;
                            catch_line_lindex = i;
                            mode = "Изменяем линию";
                        }
                        if (Math.Abs(p[i][1].X - e.X) < 5 && Math.Abs(p[i][1].Y - e.Y) < 5)
                        {
                            point_focused = true;
                            catch_point_lindex = 1;
                            catch_line_lindex = i;
                            mode = "Изменяем линию";
                        }
                    }


                }
            }
            pictureBox1.Invalidate();
        }
        private void pictureBox1_Paint(object sender,PaintEventArgs e)
        {
            graphics = e.Graphics;
            if (!pen_mode)
            {
                if (point_focused)
                {
                    graphics.DrawRectangle(new Pen(Color.Red), p[catch_line_lindex][catch_point_lindex].X - 5, p[catch_line_lindex][catch_point_lindex].Y - 5, 10, 10);
                }

                for (int i = 0; i < cnt; i++)
                {
                    graphics.DrawLine(pen[i], p[i][0].X, p[i][0].Y, p[i][1].X, p[i][1].Y);
                }
                if (mdown)
                {
                    graphics.DrawLine(pen[cnt], p[cnt][0].X, p[cnt][0].Y, p[cnt][1].X, p[cnt][1].Y);
                }
            }
           
            
                
        }

     
        private void button2_Click(object sender, EventArgs e)
        {
            graphics.Clear(pictureBox1.BackColor);
        pictureBox1.Image = map;


        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            for (int i = cnt; i < 100; i++)
                pen[i].Width = trackBar1.Value;
        }

        private void button3_Click(object sender, EventArgs e)
        {  
            for(int i=cnt;i<100;i++)
            pen[i].Color = ((Button)sender).BackColor;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            pen[cnt].Color = ((Button)sender).BackColor;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                pen[cnt].Color = colorDialog1.Color;
                ((Button)sender).BackColor = colorDialog1.Color;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (pictureBox1.Image != null) //если в pictureBox есть изображение
            {
                //создание диалогового окна "Сохранить как..", для сохранения изображения
                saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.Title = "Сохранить картинку как...";
                //отображать ли предупреждение, если пользователь указывает имя уже существующего файла
                saveFileDialog1.OverwritePrompt = true;
                //отображать ли предупреждение, если пользователь указывает несуществующий путь
                saveFileDialog1.CheckPathExists = true;
                //список форматов файла, отображаемый в поле "Тип файла"
                saveFileDialog1.Filter = "Image Files(*.BMP)|*.BMP|Image Files(*.JPG)|*.JPG|Image Files(*.GIF)|*.GIF|Image Files(*.PNG)|*.PNG|All files (*.*)|*.*";
                //отображается ли кнопка "Справка" в диалоговом окне
                saveFileDialog1.ShowHelp = true;
                if (saveFileDialog1.ShowDialog() == DialogResult.OK) //если в диалоговом окне нажата кнопка "ОК"
                {
             
                     pictureBox1.Image.Save(saveFileDialog1.FileName);
                   
                   
                }
            }
        }

        private void button13_Click(object sender, EventArgs e)
        {
            Bitmap image; //Bitmap для открываемого изображения

            OpenFileDialog open_dialog = new OpenFileDialog(); //создание диалогового окна для выбора файла
            open_dialog.Filter = "Image Files(*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG|All files (*.*)|*.*"; //формат загружаемого файла
            if (open_dialog.ShowDialog() == DialogResult.OK) //если в окне была нажата кнопка "ОК"
            {
                try
                {
                    image = new Bitmap(open_dialog.FileName);
                    //вместо pictureBox1 укажите pictureBox, в который нужно загрузить изображение 
                    this.pictureBox1.Size = image.Size;
                    pictureBox1.Image = image;
                    pictureBox1.Invalidate();
                }
                catch
                {
                    DialogResult rezult = MessageBox.Show("Невозможно открыть выбранный файл",
                    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

       

        private void button14_Click(object sender, EventArgs e)
        {   if (!pen_mode)
                pen_mode = true;
            else pen_mode = false;
        }
    }
}

Пытаюсь сделать графический векторный редактор. Но возникло несколько проблем. в button2(кнопка очищения рисунка) возникает ошибка - неправильный аргумент. Не знаю как очистить рисунок, все перепробовал - не работает. Button1(кнопка сохранения) тоже не работает. Также я сделал два режима рисования. Первый это рисование прямыми,их еще можно перетаскивать. Второе это произвольное рисование(рисует,когда зажата мышка). Вот произвольное почему-то не работает. Там тоже ошибка возникает в строке graphics.DrawLines(pen1,arrayPoints.GetPoints()); Хотя я тут массив точек и карандаш подал на вход,все правильно.


Ответы (0 шт):