Графический редактор с# 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()); Хотя я тут массив точек и карандаш подал на вход,все правильно.