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

Как при нажатии правой кнопки мыши перемещать фигуры, нарисованные на PictureBox

06.05.2011, 11:56. Показов 7853. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как при нажатии правой кнопки мыши перемещать фигуры, нарисованные на picturebox?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2011, 11:56
Ответы с готовыми решениями:

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квадрат. При повторном...

Как удалить ярлык, из меню действий при нажатии правой кнопки мыши?
Подскажите пожалуйста, как удалить. Программу полностью удалил, но осталось вот это :(

Как запретить вызов события Click при нажатии правой кнопки мыши
Доброго времени суток. Как в своём UserControl запретить вызов события Click при нажатии правой кнопки мыши? Перепробовал, наверно, все...

13
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
06.05.2011, 12:05
Если вопрос звучит так: "как перемещать?", получается у Вас уже имеется что то нарисованное. Покажите. что Вы уже нарисовали.
0
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 31
06.05.2011, 12:13  [ТС]
у меня на picturebox нарисован круг, который должен перемещаться.
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
06.05.2011, 12:14
Лучший ответ Сообщение было отмечено как решение

Решение

Один раз нажал и таскаешь за собой круг. Еще раз нажал он остался на месте.
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
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication35
{
    public partial class Form1 : Form
    {
        PictureBox pictureBox;
        bool moveOn;
        public Form1()
        {
            InitializeComponent();
            pictureBox = new PictureBox();
            this.Controls.Add(pictureBox);
            pictureBox.BackColor = Color.White;
            moveOn = false;
            pictureBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
            pictureBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
            pictureBox.Dock = DockStyle.Fill;
        }
 
        void pictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
                moveOn = !moveOn;
        }
 
        void pictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (moveOn)
            {
                Graphics graphics = pictureBox.CreateGraphics();
                graphics.Clear(Color.White);
                Rectangle rect = new Rectangle(e.X - 5, e.Y - 5, 10, 10);
                graphics.DrawEllipse(new Pen(Color.Red, 2), rect);
            }
        }
    }
}
3
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 31
06.05.2011, 12:19  [ТС]
Спасибо! То что мне и надо.
0
 Аватар для СтуденT
6 / 6 / 1
Регистрация: 18.12.2011
Сообщений: 126
20.12.2011, 01:51
А если например нужно что бы по нажатию кнопки круг сдвинулся вправо или влево мне нужно стереть старый круг и в новом месте нарисовать или можно переместить уже нарисованное?
0
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 8
06.01.2012, 14:56
Необязательно. Если ты пишешь с битмапами, то да, надо перерисовывать цветом фона, но, если у тебя каждая фигура это объект некоторого класса, и все нарисованные фигуры ты где-то хранишь и это хранилище выводишь на picturebox, то тебе достаточно выбрать в хранилище фигуру и поменять у нее координаты. В последнем случае ты абсолютно не пользуешься битмапами.
0
389 / 304 / 67
Регистрация: 10.07.2010
Сообщений: 802
06.01.2012, 15:38
Так же это можно сделать классом Matrix, методом Translate
0
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
22.03.2017, 20:53
Цитата Сообщение от vodoleika Посмотреть сообщение
Необязательно. Если ты пишешь с битмапами, то да, надо перерисовывать цветом фона, но, если у тебя каждая фигура это объект некоторого класса, и все нарисованные фигуры ты где-то хранишь и это хранилище выводишь на picturebox, то тебе достаточно выбрать в хранилище фигуру и поменять у нее координаты.
Здравствуйте. Тема старая, но у меня возник вопрос, как реализовать то, что писал Vodoleika?)

Мне нужно, чтобы пользователь мог рисовать граф - то есть кликами по пикчербоксу создавал кружки (это понятно, как делать), мог их соединять рёбрами (допустим, вводить номера нужных вершин в 2 текстбокса и жать кнопку "окей". То же самое для удаления вершин или рёбер) , а потом мышкой передвигать вершины, чтобы рёбра также новое положение принимали. И вот последняя часть меня очень смущает. Такое создавал уже кто угодно, но как реализовать это удобно - я не знаю. Кроме как следить, попал ли клик мышкой по кружку, при перемещении зажатой мышки на 1 пиксель перерисовывать кружок и все его рёбра и т.д. - это сильно похоже на дерьмокодинг. Есть более адекватная реализация?
0
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
22.03.2017, 21:01
Я в общем неоднократно встречал подобные построения

Аля наводишь мышкой на вершину или ребро - оно подсвечивется. Зажал мышку, всё можно перетащить и т.д. Но реализации никогда не видел.
Миниатюры
Как при нажатии правой кнопки мыши перемещать фигуры, нарисованные на PictureBox  
0
 Аватар для СтуденT
6 / 6 / 1
Регистрация: 18.12.2011
Сообщений: 126
23.03.2017, 00:04
Добрый вечер, видимо вы и вправду отчаялись, если решили написать в пятилетнюю тему)) С формами давно не сталкивался, но предположу что можно покопать в сторону custom controls в wpf. Создать элемент управления для вершины и для ребра и взаимодействовать с их событиями.
1
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
23.03.2017, 06:54
Цитата Сообщение от СтуденT Посмотреть сообщение
Добрый вечер, видимо вы и вправду отчаялись
Да нет, просто это единственное место в гугле, где я нашёл какое-то подобие на ответ))

Спасибо, посмотрю. С wpf не работал никогда
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
23.03.2017, 07:08
Ortaz, вот рисование и перемещение линий. Несложно добавить другие фигуры.
Кликните здесь для просмотра всего текста
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class MainForm : Form
{
    // набор фигур
    private FiguresCollection _figures = new FiguresCollection();
    
    // выбранная фигура
    private IFigure _selectedFigure;
    
    private Line _drawingLine;
    
    // предыдущая позиция мыши, когда была выбрана фигура
    private Point _previousPosition;
 
    public MainForm()
    {
        DoubleBuffered = true;
 
        // добавляем линию в коллекцию
        var line = new Line();
        line.StartPoint = new PointF(10, 10);
        line.EndPoint = new PointF(100, 100);
        line.Pen = new Pen(Color.Blue, 4);
        _figures.Add(line);
 
        // по нажатию мыши - находим фигуру, в которой попали мышкой и запоминаем координаты мыши
        this.MouseDown += (s, a) =>
        {
            _selectedFigure = _figures.GetFigure(a.X, a.Y);
            _previousPosition = a.Location;
            if (_selectedFigure == null)
            {
                _drawingLine = new Line();
                _drawingLine.StartPoint = _drawingLine.EndPoint = a.Location;
                _drawingLine.Pen = new Pen(Color.Yellow, 4);
                _figures.Add(_drawingLine);
                Invalidate();
            }
        };
 
        // снимаем выделение какой бы то ни было фигуры при отжатии мыши
        this.MouseUp += (s, a) =>
        {
            _drawingLine = null;
            _selectedFigure = null;
        };
 
        // перемещение мыши
        this.MouseMove += (s, a) =>
        {
            // если фигура не выделена, то и перемещать нечего
            if (_selectedFigure == null)
            {
                if (_drawingLine != null)
                {
                    _drawingLine.EndPoint = a.Location;
                    Invalidate();
                }
                return;
            }
 
            // находим смещение между текущей позицией мыши и предыдущей запомненной позицией
            PointF shift = Point.Subtract(a.Location, new Size(_previousPosition));
 
            // теперь текущая позиция мыши будет запомнена как предыдущая
            _previousPosition = a.Location;
 
            // производим смещение фигуры, меняя её свойство, Location
            _selectedFigure.Location = PointF.Add(_selectedFigure.Location, new SizeF(shift));
 
            // инициируем перерисовку формы
            Invalidate();
        };
 
        this.Paint += (s, a) =>
        {
            _figures.Draw(a.Graphics);
        };
    }
}
 
interface IFigure
{
    // векторное представление фигуры
    GraphicsPath GraphicsPath { get; }
 
    // Ручка, которой будет прорисована фигура (цвет и толщина)
    Pen Pen { get; set; }
 
    // расположение фигуры
    PointF Location { get; set; }
}
 
// А вот и наша линия
class Line : IFigure
{
    // начальная и конечная точки линии
    public PointF StartPoint { get; set; }
    public PointF EndPoint { get; set; }
 
    // Ручка, которой будет прорисована фигура (цвет и толщина)
    public Pen Pen { get; set; }
 
    public PointF Location
    {
        get
        {
            return StartPoint; // координатами линии считаем её начальную точку
        }
        set
        {
            // если меняем свойство Location, то нужно сместить как начальную точку так и конечную
            var shift = PointF.Subtract(value, new SizeF(Location));
            StartPoint = value;
            EndPoint = PointF.Add(EndPoint, new SizeF(shift));
        }
    }
 
    public GraphicsPath GraphicsPath
    {
        get
        {
            // возвращаем векторное представление линии
            var path = new GraphicsPath();
            path.AddLine(StartPoint, EndPoint);
            return path;
        }
    }
}
 
// класс хранящий в себе список фигур
class FiguresCollection : List<IFigure>
{
    // находит фигуру, в которую попадают координаты (x, y)
    // если такой нет, вернёт null
    public IFigure GetFigure(float x, float y)
    {
        foreach (var figure in this)
        {
            var path = figure.GraphicsPath;
 
            // IsVisible проверяет, попадает ли точка во внутрь фигуры
            // IsOutlineVisible проверяет, попадает ли точка в границу фигуры
            if (path.IsVisible(x, y) || path.IsOutlineVisible(x, y, figure.Pen))
                return figure;
        }
        return null;
    }
 
    // прорисовка всех фигур
    public void Draw(Graphics g)
    {
        foreach (var figure in this)
            g.DrawPath(figure.Pen, figure.GraphicsPath);
    }
}
1
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
23.03.2017, 08:33
Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2017, 08:33
Помогаю со студенческими работами здесь

Как отменить меню, появляющееся при нажатии правой кнопки мыши на заголовке окна?
Как отменить меню, появляющееся при нажатии правой кнопки мыши на заголовке окна???

Нажатием левой кнопки мыши выбирать и запоминать цвет, при нажатии правой кнопки мыши - устанавливать выбранный цвет
Люди добрые, киньте какой-нибудь рабочий .asm для masm, похожий на решение следующей задачи, а то мне год надо зубрить чтобы написать...

При нажатии правой кнопки мыши на форме с нее удаляются все кнопки
Написать программу, динамически порождающую на окне кнопки или метки. Левый верхний угол элемента управления определяется местоположением...

При нажатии правой кнопки мыши на форме с нее удаляются все кнопки
Написать программу, динамически порождающую на окне кнопки или метки. Левый верхний угол элемента управления определяется местоположением...

Меню при нажатии правой кнопки мыши.
Необходимо, чтобы вызывалось меню при нажатии правой кнопки мыши... Причем мне не нужен вызов формы какой-нибудь. Нужна дополнительная...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru