Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 11

Рисование прямоугольников

25.02.2014, 11:36. Показов 5441. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При нажатии левой кнопки мыши и ее удержании при перемещении мыши потенциальный прямоугольник должен отображаться пунктиром, при отпускании кнопки мыши прямоугольник должен выводиться сплошной линией.
Как реализовать чтобы контур стирался при предыдущем вызове обработчика? Сейчас он рисуется и стирается одновременно.
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
namespace lab2
{
    public partial class Form2 : Form
    {
        int xStart, yStart, xLeft, xRight, yTop, yBottom;
        bool flag;
        Pen pen;
        Graphics g;
        public Form2()
        {
            InitializeComponent();
        }
 
        private void Form2_MouseDown(object sender, MouseEventArgs e)
        {
            g = CreateGraphics();
            flag = false;
            if (e.Button == MouseButtons.Left)
            {
                flag = true;
                xStart = e.X;
                yStart = e.Y;
            }
            if (e.Button == MouseButtons.Right)
            {
                g.Clear(Color.White);
            }
        }
 
        private void Form2_MouseMove(object sender, MouseEventArgs e)
        {
 
            if (flag)
            {
                if (e.X < xStart)
                {
                    xLeft = e.X;
                    xRight = xStart;
                }
                else
                {
                    xLeft = xStart;
                    xRight = e.X;
                }
                if (e.Y < yStart)
                {
                    yBottom = e.Y;
                    yTop = yStart;
                }
                else
                {
                    yBottom = yStart;
                    yTop = e.Y;
                }
 
                pen = new Pen(Color.Black, 1);
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                g.DrawRectangle(pen, Rectangle.FromLTRB(xLeft, yBottom, xRight, yTop));
                pen = new Pen(Color.White, 1);
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                g.DrawRectangle(pen, Rectangle.FromLTRB(xLeft, yBottom, xRight, yTop));
            }
        }
 
        private void Form2_MouseUp(object sender, MouseEventArgs e)
        {
            if (flag == true)
            {
                pen = new Pen(Color.Black, 2);
                g.DrawRectangle(pen, Rectangle.FromLTRB(xLeft, yBottom, xRight, yTop));
            }
            flag = false;
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2014, 11:36
Ответы с готовыми решениями:

Рисование одинаковых прямоугольников
Рисуются прямоугольники на picturebox'е. Думаю, что есть более удобный способ их создания, в отличие от цикла for (int j = 0; j &lt; 4;...

Рисование в picturebox прямоугольников один на другом
Ребят, рисую на picturebox прямоугольник. Все хорошо рисуется, но если хочешь еще один прямоугольник нарисовать, то предыдущий пропадает и...

Рисование эллипсов и прямоугольников. Их движение на форме
Всем привет. Вот такое задание: Создать приложение, в котором в момент создания формы сверху появляется прямоугольник, а снизу -...

8
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
25.02.2014, 13:36
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Ошибка в том, что ты рисуешь вне события Paint. Так это должно выглядеть:
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
    public partial class Form1 : Form
    {
        int xStart, yStart, xLeft, xRight, yTop, yBottom;
        bool IsInDrawMode;
        //bool flag;
        Pen dashpen = new Pen(Color.Black, 2f) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash };
        Pen solidpen = new Pen(Color.Black, 2f);
        //Graphics g;
        public Form1()
        {
            InitializeComponent();
            this.Paint += Form1_Paint;
            this.MouseDown += Form1_MouseDown;
            this.MouseMove += Form1_MouseMove;
            this.MouseUp += Form1_MouseUp;
        }
 
        void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = IsInDrawMode ? dashpen : solidpen;
            Rectangle r = Rectangle.FromLTRB(xLeft, yTop, xRight, yBottom);
            e.Graphics.DrawRectangle(pen, r);
        }
 
        void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    IsInDrawMode = false;
                    this.Refresh();
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
 
        void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    if (!IsInDrawMode) return;
                    if (e.X < xStart)
                    {
                        xLeft = e.X;
                        xRight = xStart;
                    }
                    else
                    {
                        xLeft = xStart;
                        xRight = e.X;
                    }
                    if (e.Y < yStart)
                    {
                        yBottom = yStart;
                        yTop = e.Y;
                    }
                    else
                    {
                        yBottom = e.Y;
                        yTop = yStart;
                    }
                    this.Refresh();
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
 
        void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    xStart = e.X; yStart = e.Y;
                    IsInDrawMode = true;
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
    }
1
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 11
26.02.2014, 10:48  [ТС]
Спасибо, а как сделать чтобы рисовалось произвольное число прямоугольников?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
26.02.2014, 13:06
т.е.? Опиши подробнее, что хочешь получить
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 11
26.02.2014, 22:24  [ТС]
В вашем примере при рисовании нового прямоугольника старый стирается. Вот как сделать чтобы он не стирался?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
27.02.2014, 06:02
Ну как? Сохранять где-то, например в GraphicsPath:
Кликните здесь для просмотра всего текста
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
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int xStart, yStart, xLeft, xRight, yTop, yBottom;
        bool IsInDrawMode;
        Pen dashpen = new Pen(Color.Blue, 0.8f) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash };
        Pen solidpen = new Pen(Color.Black, 2f);
        GraphicsPath gp;//Сюда сохраняются нарисованные прямоугольники
        public Form1()
        {
            InitializeComponent();
            this.Paint += Form1_Paint;
            this.MouseDown += Form1_MouseDown;
            this.MouseMove += Form1_MouseMove;
            this.MouseUp += Form1_MouseUp;
            gp = new GraphicsPath();
        }
 
        void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = IsInDrawMode ? dashpen : solidpen;
            Rectangle r = Rectangle.FromLTRB(xLeft, yTop, xRight, yBottom);
            if (gp.PointCount != 0)
                e.Graphics.DrawPath(solidpen, gp);
            e.Graphics.DrawRectangle(pen, r);
        }
 
        void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    IsInDrawMode = false;
                    this.Refresh();
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
 
        void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    if (!IsInDrawMode) return;
                    if (e.X < xStart)
                    {
                        xLeft = e.X;
                        xRight = xStart;
                    }
                    else
                    {
                        xLeft = xStart;
                        xRight = e.X;
                    }
                    if (e.Y < yStart)
                    {
                        yBottom = yStart;
                        yTop = e.Y;
                    }
                    else
                    {
                        yBottom = e.Y;
                        yTop = yStart;
                    }
                    this.Refresh();
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
 
        void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    xStart = e.X; yStart = e.Y;
                    IsInDrawMode = true;
                    gp.AddRectangle(Rectangle.FromLTRB(xLeft, yTop, xRight, yBottom));
                    break;
                case MouseButtons.Right:
                    break;
                default:
                    break;
            }
        }
    }
}

Внесённые изменения:
  1. Добавлена переменная gp типа GraphicsPath;
  2. Добавлена инициализация этой переменной в конструкторе формы;
  3. Включена двойная буферизация формы в конструкторе;
  4. Немного изменена процедура прорисовки формы;
  5. В событие отпускания кнопки мыши дописана строка для добавления заданного прямоугольника в GraphicsPath.
Но если ты захочешь ещё заливку делать или как-то разными цветами рисовать, то тогда придётся использовать Bitmap для хранения изображения на форме
1
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 11
04.03.2014, 10:45  [ТС]
Последний вопрос, при нажатии пкм все прямоугольники должны удаляться. Сделала так, но удаляются все, кроме последнего нарисованного.
C#
1
2
3
4
if (e.Button == MouseButtons.Right)
            {
                gp.Reset();
            }
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.03.2014, 11:03
Нужно добавить ещё один флаг и немного дополнить два события:
Кликните здесь для просмотра всего текста
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
bool Draw;//Нужно ли отрисовывать
void Form1_Paint(object sender, PaintEventArgs e)
{
    if (!Draw) return;
    Pen pen = IsInDrawMode ? dashpen : solidpen;
    Rectangle r = Rectangle.FromLTRB(xLeft, yTop, xRight, yBottom);
    if (gp.PointCount != 0)
        e.Graphics.DrawPath(solidpen, gp);
    e.Graphics.DrawRectangle(pen, r);
}
 
void Form1_MouseUp(object sender, MouseEventArgs e)
{
    switch (e.Button)
    {
        case MouseButtons.Left:
            IsInDrawMode = false;
            Draw = true;
            this.Refresh();
            break;
        case MouseButtons.Right:
            Draw = false;
            gp.Reset()
            this.Refresh();
            break;
        default:
            break;
    }
}
2
4 / 4 / 1
Регистрация: 01.06.2014
Сообщений: 8
11.04.2016, 21:55
Такой вопрос, а как ещё можно сделать чтобы не удалялся старый прямоугольник, у меня что то похожее на Paint, и при таком способе понадобится
1) много памяти для хранения разных каляк-маляк;
2) При восстановлении все рисунки будут одного цвета, даже, если нарисованы разными кистями, если только не задавать для каждой кисти разный GraphicsPath;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2016, 21:55
Помогаю со студенческими работами здесь

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3 4 1 3 кпримеру, мне нужно...

рисование прямоугольников
необходимо написать программу, которая строит прямоугольники по нажатию мыши. само рисование я уже нашел. var x1, y1: integer; ...

Рисование прямоугольников
Помогите нужно очень! Задание: нарисовать несколько (3-4) разноцветных прямоугольников с одинаковой шириной но разной высотой(задается...

C++ и OpenGL. Рисование прямоугольников
Простой вопрос. Должно быть как на первой картинке, по факту выходит как на второй. Почему так получается.. Код вот. Спасибо. ...

Рисование прямоугольников черепахами
нужно написать функцию prjamougolnik(), где в роли параметров выступает две боковые длины, и с помощью черепахи рисуется соответствующие...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru