вторник, 18 июня 2013 г.

Создание инструмента для рисование с помощью C#

Думаю всем известен стандартная программа Windows - Paint, который дает возможность сделать разные действие над картинками. Также с помощью этой программы можно рисовать картинки выбрав карандаш с некоторой толщиной и цвета. Тут, и в несколько других статьях будем создать маленький инструмент с помощью C#-а, который будет иметь функционал, схожий Paint. 

1. Создаем новый проект File -> New Project
2. Выберем Visual C# - Windows Forms Application, назовем проект Paint (или так как хотите) и нажимаем OK.

3. Появится Form, добавим два Button, один Panel и ColorDialog. Окно должен иметь такой вид


В этой статье буду представлять функционал рисования с самым тонким карандашом. 
Давайте описать те шаги, с помощью которого пользователь будет рисовать в поверхности.
1. Клик левой кнопкой мыши
2. Мышь движется с некоторой траекторией, это траектория и будет рисунок пользователя
3. Пользователь выпускает кнопка мыши

Открываем программу Form и начинаем написать программу.
В программу дается возможность выбрать цвет карандаша, но по умолчанию оно будет черным. Для этого обявым переменную типа Color
    Color CurrentColor = Color.Black;

В каждый момент времени факт нажатия кнопки будет проверен с помощью переменную типа bool - isPressed
    bool isPressed = false;

Когда после клика мыши перетаскиваем его над Panel, в каждой позиции мыши можем иметь прежний и текущий позиции, для этого обьявляем следующие переменные
     Point CurrentPoint;
     Point PrevPoint;

И наконец для рисование будем обьявить переменную g
     Graphics g;


Создаем событие для кнопки выбора цвета, и добавляем в нем такой код
        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult D = colorDialog1.ShowDialog();
            if (D == System.Windows.Forms.DialogResult.OK)
                CurrentColor = colorDialog1.Color;
        }

Для очистки уже рисованного добавим следующую событию
        private void button2_Click_1(object sender, EventArgs e)
        {
            panel1.Refresh();
        }

Для следования нажатия, выпуска и перетаскивания мыши будем создать событии MouseDown, MouseUp, MouseMove 
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            isPressed = true;
            CurrentPoint = e.Location;
        }

Во время перетаскивание мыши должен быть проверен условия нажат левая кнопка мыши или нет. Если да, то мы должны взят предыдущие и текущие позиции мыши и с помощью этих позиций рисовать линию.
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isPressed)
            {
                PrevPoint = CurrentPoint;
                CurrentPoint = e.Location;
                paint_simple();
            }
        }
функция paint_simple() имеет такой вид
        private void paint_simple()
        {
            Pen p = new Pen(CurrentColor);
            g.DrawLine(p, PrevPoint, CurrentPoint);
        }

Кажется все
Вот пример использование программы и код


using System;
using System.Drawing;
using System.Windows.Forms;

namespace Paint
{
    public partial class Form1 : Form
    {
        Color CurrentColor = Color.Black; //Default color
        Point CurrentPoint; //Current Position
        Point PrevPoint; //Previous Position
        bool isPressed;
        Graphics g;

        public Form1()
        {
            InitializeComponent();
            g = panel1.CreateGraphics();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult D = colorDialog1.ShowDialog();
            if (D == System.Windows.Forms.DialogResult.OK)
                CurrentColor = colorDialog1.Color;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            isPressed = true;
            CurrentPoint = e.Location;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isPressed)
            {
                PrevPoint = CurrentPoint;
                CurrentPoint = e.Location;
                paint_simple();
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            isPressed = false;
        }

        private void paint_simple()
        {
            Pen p = new Pen(CurrentColor);
            g.DrawLine(p, PrevPoint, CurrentPoint);
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            panel1.Refresh();
        }
    }
}



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

Отправить комментарий