Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172

MouseMove - фигура не движется

05.04.2015, 22:35. Показов 2080. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю как заставить двигаться фигуру
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
 private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            status = true;
            mouseDownLocation = e.Location;
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            status = false;
            mouseUpLocation = e.Location;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            mouseMoveLocation.X = e.Location.X;
            mouseMoveLocation.Y = e.Location.Y;
            if (status)
            {
                PosMouseFormX = mouseDownLocation.X - mouseMoveLocation.X;
                PosMouseFormY = mouseDownLocation.Y - mouseMoveLocation.Y;
                p.MoveBy(PosMouseFormX, PosMouseFormY, P);
                p.DrawPol(ew, P);
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2015, 22:35
Ответы с готовыми решениями:

Построить фигуру, которая состоит из трех концентрических колец разного цвета. Фигура движется по кругу по часовой стрелке
Построить фигуру, которая состоит из трех концентрических колец разного цвета. Фигура движется по кругу по часовой стрелке

MouseMove
Как программно отключить событие MouseMove

MouseMove
Здравствуйте, подскажите, как сделать так чтобы после убирания курсора с Label, картинка (Image) скрывалась Добавлено через 3 минуты ...

7
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.04.2015, 23:12
Лучший ответ Сообщение было отмечено Оксана 1234 как решение

Решение

Оксана 1234,
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WindowsFormsApplication268
{
    public partial class Form1 : Form
    {
        private List<Figure> figures = new List<Figure>();
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
 
            BuildFigures();
        }
 
        private void BuildFigures()
        {
            var rnd = new Random();
 
            for (int i = 0; i < 10; i++)
            {
                var f = Figure.CreateSquare(10 + rnd.Next(10));
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
 
                f = Figure.CreateCircle(10 + rnd.Next(10));
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            foreach (var f in figures)
                f.Draw(e.Graphics);
        }
 
        private Figure capturedFigure;
        private Point capturedPoint;
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
 
            if (e.Button == MouseButtons.Left)
            foreach (var f in figures)
            if (f.HitTest(e.Location))
            {
                capturedFigure = f;
                capturedPoint = e.Location;
                break;
            }
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
 
            capturedFigure = null;
        }
 
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
 
            if(capturedFigure != null)
            {
                capturedFigure.Offset(e.X - capturedPoint.X, e.Y - capturedPoint.Y);
                capturedPoint = e.Location;
                Invalidate();
            }
        }
    }
 
    class Figure
    {
        public Point Location { get;set;}
        public GraphicsPath Path { get; set; }
 
        public bool HitTest(Point point)
        {
            point.Offset(-Location.X, -Location.Y);
            return Path.IsVisible(point);
        }
 
        public void Offset(int dx, int dy)
        {
            Location = new Point(Location.X + dx, Location.Y + dy);
        }
 
        public static Figure CreateSquare(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddRectangle(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public static Figure CreateCircle(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddEllipse(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public void Draw(Graphics g)
        {
            var state = g.Save();
            g.TranslateTransform(Location.X, Location.Y);
            g.DrawPath(Pens.Black, Path);
            g.Restore(state);
        }
    }
}
1
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172
06.04.2015, 15:21  [ТС]
Я пробовала переделать свою программу под этот код , но программа оказалась сложной для моего понимания .
Вот без лишнего , код моей программы, если не сложно чуть-чуть помогите .
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Laba_2
{
    public partial class Form1 : Form
    {
        PaintEventArgs ew;
        MyPolygon p = new MyPolygon();
        Point p0, mouseDownLocation, mouseUpLocation, mouseMoveLocation;
        int flag = 0;
        bool status = false;
        int ker;
        Point[] P;
        GraphicsPath Path = new GraphicsPath();
        int PosMouseFormX, PosMouseFormY;
        public Form1()
        {
            InitializeComponent();
            ew = new PaintEventArgs(this.CreateGraphics(), this.Bounds);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            p.VerticesCount = 4;
            ker = p.VerticesCount;
            P = new Point[ker];
            int start, end;
            end = 100;
            for (int i = 0; i < ker; i++)
            {
                start = end;
                end = 120 + (-1) ^ (i * 31 + 5);
                P[i]=new Point(start, end);
            }
            Path.AddPolygon(P);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            if (flag == 0)
            {
                p0 = new Point(0,0);
                p.DrawPol(ew, P);
            }
            flag++;
        }
 
     
 
        private void button1_Click(object sender, EventArgs e)
        {
             Graphics g = this.CreateGraphics();
            {
                g.DrawPath(new Pen(Color.Red, 2), Path);
            }
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            status = true;
            mouseDownLocation = e.Location;
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            status = false;
            mouseUpLocation = e.Location;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            mouseMoveLocation.X = e.Location.X;
            mouseMoveLocation.Y = e.Location.Y;
            if (status)
            {
                PosMouseFormX = mouseDownLocation.X - mouseMoveLocation.X;
                PosMouseFormY = mouseDownLocation.Y - mouseMoveLocation.Y;
                p.MoveBy(PosMouseFormX, PosMouseFormY, P);
                p.DrawPol(ew, P);
            }
        }
    }
}
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
namespace Laba_2
{
   public class MyPolygon
    {
        public
       int n;
       int k = 1;
 
        public int VerticesCount
        {
            get
            {
                return n;
            }
            set
            {
                n = value;
            }
        }
 
        public MyPolygon()
        {
        }
 
        public void DrawPol(PaintEventArgs ed, Point[] points)
         {
             Pen blackPen = new Pen(Color.DarkRed, 2);
             ed.Graphics.DrawPolygon(blackPen, points.ToArray());
         }
 
 
 
        public void MoveBy(int x, int y, Point[] points)
        {
             for (int i = 0; i < points.Length; i++)
            {
                Point str = points[i];
                str.X = str.X + x;
                str.Y = str.Y + y;
                points[i] = str;
            }
        }
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.04.2015, 18:12
Лучший ответ Сообщение было отмечено Оксана 1234 как решение

Решение

Оксана 1234, Ваш код - сплошная боль
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
    public partial class Form1 : Form
    {
        MyPolygon p;
        Point mouseDownLocation, mouseUpLocation, mouseMoveLocation;
        int flag = 0;
        bool status = false;
        int PosMouseFormX, PosMouseFormY;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            int ker = 4;
            var P = new Point[ker];
            int start, end;
            end = 100;
            for (int i = 0; i < ker; i++)
            {
                start = end;
                end = 120 + (-1) ^ (i * 31 + 5);
                P[i] = new Point(start, end);
            }
            p = new MyPolygon(P);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            p.Draw(e.Graphics);
        }
 
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            p.BorderColor = Color.Red;
            Invalidate();
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            status = true;
            if(e.Button == System.Windows.Forms.MouseButtons.Left)
                mouseDownLocation = e.Location;
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            status = false;
            mouseUpLocation = e.Location;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (status)
            if (e.Button == MouseButtons.Left)
            {
                PosMouseFormX = e.X - mouseDownLocation.X;
                PosMouseFormY = e.Y - mouseDownLocation.Y;
                p.MoveBy(PosMouseFormX, PosMouseFormY);
 
                mouseDownLocation = e.Location;
 
                Invalidate();
            }
        }
    }
 
    public class MyPolygon
    {
        private Point[] points;
        public Color BorderColor { get;set; }
 
        public int VerticesCount
        {
            get { return points.Length; }
        }
 
        public MyPolygon(Point[] points)
        {
            this.points = points;
            BorderColor = Color.DarkRed;
        }
 
        public void Draw(Graphics gr)
        {
            using(Pen blackPen = new Pen(BorderColor, 2))
                gr.DrawPolygon(blackPen, points.ToArray());
        }
 
        public void MoveBy(int x, int y)
        {
            for (int i = 0; i < points.Length; i++)
            {
                Point p = points[i];
                p.X = p.X + x;
                p.Y = p.Y + y;
                points[i] = p;
            }
        }
    }
1
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172
06.04.2015, 18:48  [ТС]
Очень большое спасибо. Можете подсказать литературу на мой уровень по C# Windows Form, чтобы этот код не был таким ужасным?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.04.2015, 19:03
Оксана 1234, Так у вас проблема не столько с C#, как с ООП вцелом. Например, почему ваш класс MyPolygon не хранит набор точек? Ведь он для этого и предназначен. Зачем вы создаете отдельный GraphicsPath, который фактически дублирует массив точек?
Ну и с логикой отрисовки у вас проблемы (как и у 90% новичков впрочем).
1
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172
06.04.2015, 20:05  [ТС]
GraphicsPath мне нужен для того чтобы определить нахожусь ли я всередине многоугольника, чтобы эго перетягивать.
Цитата Сообщение от Storm23 Посмотреть сообщение
почему ваш класс MyPolygon не хранит набор точек?
Значит должно быть так:
C#
1
        public MyPolygon(Point[] points)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.04.2015, 20:09
Лучший ответ Сообщение было отмечено Оксана 1234 как решение

Решение

Цитата Сообщение от Оксана 1234 Посмотреть сообщение
GraphicsPath мне нужен для того чтобы определить нахожусь ли я всередине многоугольника, чтобы эго перетягивать.
Значит внутри MyPolygon создайте Path на основании точек и создайте метод HitTest(Point p), который будет возвращать true, если точка находится внутри полигона. Сами точки в таком случае хранить не обязательно.
Собственно в первом примере, который я вам дал так и было.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2015, 20:09
Помогаю со студенческими работами здесь

Обрaботчик MouseMove
Всем привет! Нужна Ваша помощь в решении задачи: Задача 1 Через обработчик MouseMove сделать так,что в название формы(caption)...

Property MouseMove()
Здравствуйте! Объясните пожалуйста почему при наведении мыши на форму не меняется цвет текста в кнопках? Весь код: Private Sub...

Помощь с MouseMove
Помогите плиз, нужно чтобы, например, когда я наводил мышкой на Edit1, появлялась всплывающая подсказка типа 'Курсор находится над объектом'

Событие MouseMove
Добрый день. Задача в общем такая: курсор должен пройти по Z(или по О(по кругу)) и приложение выполняет какое-либо действие, тот же самый...

MouseMove на форме
Дорогие ребята Поздравляю Вас, c праздником ПОБЕДЫ! А теперь: Private Sub Form1_MouseMove(Sender As Object, ByVal e As System...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru