Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 4

Рисование прямоугольников по движению мыши

03.06.2018, 10:21. Показов 5236. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Есть конструкция Viewbox > Canvas. В Canvas нужно нарисовать прямоугольники по движению мыши, с зажатой левой кнопкой.
Прямоугольники не должны наслаиваться друг на друга.
Сейчас код выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            if ((e.LeftButton.ToString() == "Pressed") && !(e.OriginalSource is Rectangle)) 
//Проверяем нажата ли клавиша и наличие прямоугольника на этой позиции.
            {
                var myRect = new Rectangle();
                myRect.Fill = Brushes.OrangeRed;
                myRect.Width = RectWidth;
                myRect.Height = RectHeight;
                int PositionX = (int)(Math.Floor(e.GetPosition(myCanvas).X / RectFullWidth) * RectFullWidth); 
// вычисляем позицию по оси X для добавления прямоугольника 
                int PositionY = (int)(Math.Floor(e.GetPosition(myCanvas).Y / RectFullHeight) * RectFullHeight); 
// вычисляем позицию по оси Y для добавления прямоугольника
                Canvas.SetLeft(myRect, PositionX);
                Canvas.SetTop(myRect, PositionY);
                myCanvas.Children.Add(myRect);
            }
Код работает, но есть одна проблема. В одну ячейку записывается сразу несколько прямоугольников и наслаиваются один на другой, а нужен только один.

Помогите решить эту проблему.
Миниатюры
Рисование прямоугольников по движению мыши  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2018, 10:21
Ответы с готовыми решениями:

Вызов подпрограммы по движению мыши для свернутого приложения
По мотивам темы https://www.cyberforum.ru/vb-net/thread526667.html Использовал данные коды в своих приложениях, но поймал себя на мысли,...

Как улучшить данный код рисования прямоугольника по движению мыши?
Как улучшить данный код рисования прямоугольника по движению мыши? using System; using System.Drawing; using System.Windows.Forms; ...

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

5
35 / 34 / 11
Регистрация: 23.09.2012
Сообщений: 112
04.06.2018, 19:38
Лучший ответ Сообщение было отмечено cyber-nub как решение

Решение

Пробовал ваш пример - у меня работает как надо. Не понял основной задачи, но например по одиночному нажатию кнопки мыши прекрасно отрисовывается и не наслаивается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void myCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if ((e.LeftButton.ToString() == "Pressed") && !(e.OriginalSource is Rectangle))
            //Проверяем нажата ли клавиша и наличие прямоугольника на этой позиции.
            {
                var myRect = new Rectangle();
                myRect.Fill = Brushes.OrangeRed;
                myRect.Width = 10; //RectWidth;
                myRect.Height = 10; //RectHeight;
                int PositionX = (int)(Math.Floor(e.GetPosition(myCanvas).X / 10) * 10);
                // вычисляем позицию по оси X для добавления прямоугольника 
                int PositionY = (int)(Math.Floor(e.GetPosition(myCanvas).Y / 10) * 10);
                // вычисляем позицию по оси Y для добавления прямоугольника
                Canvas.SetLeft(myRect, PositionX);
                Canvas.SetTop(myRect, PositionY);
                myCanvas.Children.Add(myRect);
            }
        }
по движению мыши тоже самое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void myCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            if ((e.LeftButton.ToString() == "Pressed") && !(e.OriginalSource is Rectangle))
            //Проверяем нажата ли клавиша и наличие прямоугольника на этой позиции.
            {
                var myRect = new Rectangle();
                myRect.Fill = Brushes.OrangeRed;
                myRect.Width = 10; //RectWidth;
                myRect.Height = 10; //RectHeight;
                int PositionX = (int)(Math.Floor(e.GetPosition(myCanvas).X / 10) * 10);
                // вычисляем позицию по оси X для добавления прямоугольника 
                int PositionY = (int)(Math.Floor(e.GetPosition(myCanvas).Y / 10) * 10);
                // вычисляем позицию по оси Y для добавления прямоугольника
                Canvas.SetLeft(myRect, PositionX);
                Canvas.SetTop(myRect, PositionY);
                myCanvas.Children.Add(myRect);
            }
        }
Ну и XAML:
HTML5
1
2
3
                <Viewbox Width="400" Height="400">
                    <Canvas Name="myCanvas" MouseLeftButtonDown="myCanvas_MouseLeftButtonDown" MouseMove="myCanvas_MouseMove" Background="Black" Width="300" Height="300"/>
                </Viewbox>
Можэт я чтото не так понял?

Добавлено через 1 минуту
Я установил фиксированный размер прямоугольника
1
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 4
04.06.2018, 19:52  [ТС]
C#
1
2
3
4
5
6
7
8
      private void myCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.OriginalSource is Rectangle)
            {
                Rectangle myRect = (Rectangle)e.OriginalSource;
                myCanvas.Children.Remove(myRect);
            }
        }
При попытке удалить прямоугольник из ячейки, становиться понятно, что их там больше одного (один по верх другого). Для удаления приходится много раз щелкать мышью. Кроме того, я планировал считать нарисованные прямоугольники по индексу. Хотелось бы получить результат: 1 ячейка = 1 прямоугольник.
0
35 / 34 / 11
Регистрация: 23.09.2012
Сообщений: 112
04.06.2018, 20:27
Посмотрите мой вариант - по прежнему работает как заказывали...
Вложения
Тип файла: zip RectangleQuestion.zip (35.2 Кб, 16 просмотров)
0
35 / 34 / 11
Регистрация: 23.09.2012
Сообщений: 112
04.06.2018, 20:27
Не понятно про ячейку - что это такое и где она?
0
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 4
04.06.2018, 22:36  [ТС]
Спасибо, я понял в чем проблема. У вас фиксированный размер = 10 пикселей, без промежутка между фигурами. А у меня есть промежуток в 1 пиксель между прямоугольниками(RectFullWidth > RectWidth). И при наведении на него курсора мыши, условие "!(e.OriginalSource is Rectangle)" не срабатывает, зато работает округление в меньшую сторону (int)(Math.Floor(e.GetPosition(myCanvas) .X / RectFullWidth) * RectFullWidth).

Добавлено через 46 минут
Сделал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if ((e.LeftButton.ToString() == "Pressed") && !(e.OriginalSource is Rectangle)) 
//Проверяем нажата ли клавиша и наличие прямоугольника на этой позиции.
            {
                var myRect = new Rectangle();
                myRect.Fill = Brushes.OrangeRed;
                myRect.Width = RectFullWidth; // рисуем прямоугольник большего размера
                myRect.Height = RectFullHeight;
                myRect.Stroke = Brushes.Transparent; // создаем прозрачную обводку в 1 пиксель
                myRect.StrokeThickness = 1;
                int PositionX = (int)(Math.Floor(e.GetPosition(myCanvas).X / RectFullWidth) * RectFullWidth); 
// вычисляем позицию по оси X для добавления прямоугольника 
                int PositionY = (int)(Math.Floor(e.GetPosition(myCanvas).Y / RectFullHeight) * RectFullHeight); 
// вычисляем позицию по оси Y для добавления прямоугольника
                Canvas.SetLeft(myRect, PositionX);
                Canvas.SetTop(myRect, PositionY);
                myCanvas.Children.Add(myRect);
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2018, 22:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru