0 / 0 / 0
Регистрация: 30.08.2011
Сообщений: 3
1

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

06.09.2011, 00:12. Показов 4394. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, подскажите как реализовать рисование прямоугольника как в Paint. т.е. пока левая кнопка зажата, прямоугольник можно двигать, а когда пользователь отпускает кнопку мыши, то рисование прямоугольника завершается.....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2011, 00:12
Ответы с готовыми решениями:

Графический редактор
Хочу написать графический редактор в C#. Встал вопрос о панели инструментов. В фотошопе эта...

Графический редактор на С#
Можете выложить пример графического редактора типапаинт на си шарп. Р.S Не выкладывайте исходники...

Графический редактор
Здраствуйте. Подскажите пожайлуста как можно осуществить следующие. Я хочу написать простенький...

ластик(графический редактор)
Здравствуйте,делаю графический редактор на шарпе не знаю как сделать ластик(вариант просто...

3
Level 2
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
06.09.2011, 00:48 2
И кстати, я не подумал об этом, но квадраты рисуются только в направлении вниз-вправо (в направлении вверх-лево не знаю как организовать... Если кто знает как сделать, поделитесь)
Доработал код, теперь можно рисовать много прямоугольников (может не лучший способ, но вроде работает и не тормозит)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
        }
 
        bool temp = false;
        int X = 0;
        int Y = 0;
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            temp = true;
            X = e.X;
            Y = e.Y;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (temp)
            {
                Bitmap bm = new Bitmap(Width, Height);
                Graphics g = Graphics.FromImage(bm);
                g.Clear(this.BackColor);
                g.DrawRectangle(new Pen(Color.Black, 4), X, Y, Math.Abs(X - e.X), Math.Abs(Y - e.Y));
                for (int i = 0; i < RectParams.Length; i++)
                    g.DrawRectangle(new Pen(Color.Black, 4), RectParams[i].X, RectParams[i].Y, RectParams[i].Width, RectParams[i].Height);
                BackgroundImage = bm;
            }
        }
 
        struct RectangleParametres
        {
            public int X;
            public int Y;
            public int Width;
            public int Height;
        }
 
        RectangleParametres[] RectParams = new RectangleParametres[0];
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Array.Resize(ref RectParams, RectParams.Length + 1);
            RectParams[RectParams.Length - 1].X = X;
            RectParams[RectParams.Length - 1].Y = Y;
            RectParams[RectParams.Length - 1].Width = Math.Abs(X - e.X);
            RectParams[RectParams.Length - 1].Height = Math.Abs(Y - e.Y);
            temp = false;
        }
    }
}
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
06.09.2011, 01:27 3
Можно рисовать в буфере и потом уже выводить на экран. Вот как тут в примере:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication8
{
    public partial class FormBackground : Form
    {
        Rectangle rectSelected; //прямоугольник которым выделяют
        Rectangle rectBack; //прямоугольник для заливки всего окна
        Size size;
        Point clickPoint;
        Point nowPoint;
        Graphics gr;
        BufferedGraphics bufferGraphics;
        BufferedGraphicsContext bufferGraphicsContext;
        Pen pen;
        Pen ErasePen;
        SolidBrush br, brushBack; //кисти
 
        public FormBackground()
        {
            InitializeComponent();
        }
 
        private void FormBackground_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) //если нажата левая кнопка мыши
            {
                clickPoint.X = e.Location.X;
                clickPoint.Y = e.Location.Y;
            }
        }
 
        private void FormBackground_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                nowPoint.X = e.X;
                nowPoint.Y = e.Y;
                if (nowPoint.X > clickPoint.X)
                {
                    size.Width = nowPoint.X - clickPoint.X; //вычитаем из места где был первый клик текущее 
                    rectSelected.X = clickPoint.X;
                }
                else
                {
                    size.Width = clickPoint.X - nowPoint.X;
                    rectSelected.X = clickPoint.X - size.Width;
                }
 
                if (nowPoint.Y > clickPoint.Y)
                {
                    size.Height = nowPoint.Y - clickPoint.Y;
                    rectSelected.Y = clickPoint.Y;
                }
                else
                {
                    size.Height = clickPoint.Y - nowPoint.Y;
                    rectSelected.Y = clickPoint.Y - size.Height;
                }
 
                rectSelected.Width = size.Width;
                rectSelected.Height = size.Height;
 
                DrawToBuffer(); //Производим отрисовку в буфере
                bufferGraphics.Render(); //выводим, то что отрисовалось в буфере
            }
        }
 
        private void FormBackground_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Cursor.Current = Cursors.Default;
            }
        }
 
        private void FormBackground_Load(object sender, EventArgs e)
        {
            this.Visible = false;
 
            size = new Size(0, 0);
 
            clickPoint = new Point(0, 0);
            nowPoint = new Point(0, 0);
            rectSelected = new Rectangle(nowPoint, size);
 
            br = new SolidBrush(Color.Honeydew); //для заполнения внутренней части выделяемого прямоугольника, чтобы
            //жёлтое окно стало прозрачным внутри прямоугольника
            brushBack = new SolidBrush(Color.FromArgb(224, 224, 224)); //для заливки всего окна (типа стёрка, чтобы не мигало как в Clear())
 
            pen = new Pen(Color.Red, 1); //то чем рисуется выделяемая область
            ErasePen = new Pen(Color.FromArgb(224, 224, 224), 1); //Стёрка. Цвет совпадает с фоновым прозрачной формы
            rectBack = Screen.PrimaryScreen.Bounds;
 
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
            UpdateStyles();
            gr = Graphics.FromHwnd(this.Handle);
            bufferGraphicsContext = new BufferedGraphicsContext();
            bufferGraphicsContext = BufferedGraphicsManager.Current;
 
            Cursor = Cursors.Cross; //заменяет курсор крестиком
        }
 
        /// <summary>Отрисовываем всё в буфере</summary>
        public void DrawToBuffer()
        {   //выставляем размер буфера "весь экран"
            bufferGraphicsContext.MaximumBuffer = new Size(this.Width, this.Height);
 
            bufferGraphics = bufferGraphicsContext.Allocate(gr,
                 new Rectangle(0, 0, this.Width, this.Height)); //создаём буфер
 
            bufferGraphics.Graphics.FillRectangle(brushBack, rectBack); //стераем прошлый рисунок
            bufferGraphics.Graphics.DrawRectangle(pen, rectSelected); //рисуем новый прямоугольник
            bufferGraphics.Graphics.FillRectangle(br, rectSelected); //заливаем его цветом
 
            //начинаем это делать именно здесь, потому, что нужно сдвигать только рамку
            rectSelected.X -= 1; //делаем так, чтобы небыло видно рамки на скриншоте (расширяем рамку на 1 пиксель)
            rectSelected.Y -= 1; // (расширяем рамку на 1 пиксель)
            rectSelected.Height += 1;
            rectSelected.Width += 1;
 
            bufferGraphics.Graphics.DrawRectangle(pen, rectSelected); //рисуем новый прямоугольник
 
            rectSelected.X += 1; //возвращаем всё на место как было
            rectSelected.Y += 1;
            rectSelected.Height -= 1;
            rectSelected.Width -= 1;
        }
    }
}
Изображение не мигает естественно, так как рисуется в буфере.

Добавлено через 5 минут
Кстати, это я как-то давно писал выделения области на экране для снятия скриншота, так что некоторые комментарии в коде немного не в тему. Я просто тот старый код перекинул на новую форму и удалил всё лишнее.
1
Level 2
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
06.09.2011, 02:15 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
        }
 
        struct RectangleParametres
        {
            public int X;
            public int Y;
            public int Width;
            public int Height;
        }
 
        RectangleParametres[] RectParams = new RectangleParametres[0];
        int X = 0;
        int Y = 0;
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            X = e.X;
            Y = e.Y;
            Array.Resize(ref RectParams, RectParams.Length + 1);
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Bitmap bm = new Bitmap(Width, Height);
                Graphics g = Graphics.FromImage(bm);
                if (X < e.X)
                {
                    RectParams[RectParams.Length - 1].Width = e.X - X;
                    RectParams[RectParams.Length - 1].X = X;
                }
                else
                {
                    RectParams[RectParams.Length - 1].Width = X - e.X;
                    RectParams[RectParams.Length - 1].X = X - RectParams[RectParams.Length - 1].Width;
                }
                if (Y < e.Y)
                {
                    RectParams[RectParams.Length - 1].Height = e.Y - Y;
                    RectParams[RectParams.Length - 1].Y = Y;
                }
                else
                {
                    RectParams[RectParams.Length - 1].Height = Y - e.Y;
                    RectParams[RectParams.Length - 1].Y = Y - RectParams[RectParams.Length - 1].Height;
                }
                for (int i = 0; i < RectParams.Length; i++)
                    g.DrawRectangle(new Pen(Color.Black, 4), RectParams[i].X, RectParams[i].Y, RectParams[i].Width, RectParams[i].Height);
                BackgroundImage = bm;
            }
        }
    }
}
Чуть переделал, теперь всё отлично работает.
P.S. - Изначально подумывал делать так как Casper-SC (спасибо за вариант), но почему то решил что не получится (я насчёт нормальной отрисовки прямоугольника во все стороны).
0
06.09.2011, 02:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2011, 02:15
Помогаю со студенческими работами здесь

Создать простой векторный графический редактор
Доброго времени суток! Мне необходимо создать простой векторный графический редактор, в котором...

Графический редактор (вытягивание фигур , как Microsoft Visio)
Здравствуйте. Подскажите пожалуйста реализацию вытягивания фигур вверх, вниз,, вправо и влево, как...

Графический редактор
Всем привет! Надо написать графический редактор на C# ( курсовая работа ) Минимальный набор...

Графический редактор
Люди добрые подскажите, легко ли будет реализовать программу на с#, которая будет открывать...

Графический редактор
рисую елементарные примитив (к примеру прямоугольник) в MouseDown запоминаю начальные координаты...

Графический редактор C#
Здравствуйте, задали такое задание, написать графический редактор, писать надо с элементами ООП, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru