Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126

Как сделать так, чтобы линия "тянулась" за мышью?

27.10.2019, 04:34. Показов 7266. Ответов 25

Студворк — интернет-сервис помощи студентам
Доброго времени суток! При написании графического редактора столкнулся с проблемой, никак не получается решить.
В общем линия у меня рисуется в локальных координатах открытого изображения (нужно именно так), за мышкой тянется, но прорисовывается каждый шаг движения мыши, а мне нужно удалить только что нарисованное и нарисовать линию заново при событии MouseMove. Метод Clear не помогает, так как линия должна идти поверх открытого рисунка, а не на однородном фоне.
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
        private void zoomPictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                {
                    //открытый рисунок
                    canvas = new Bitmap(zoomPictureBox1.Image); 
                    // холст для рисования линии
                    canvas2 = new Bitmap(zoomPictureBox1.Image.Width, zoomPictureBox1.Image.Height);
                    //стртовая точка в локальных координатах открытого изображения
                    StartPositionLassoScreen = new Point(zoomPictureBox1.ClientToImagePoint(e.Location).X,
                        zoomPictureBox1.ClientToImagePoint(e.Location).Y);
                    //признак начала рисования
                    pressedLasso = true;
                }
        }
 
        private void zoomPictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (pressedLasso)
                {
                    canvas2 = canvas;
                    Graphics graph = Graphics.FromImage(canvas2);
                    //-----------------------------------------------------
                    // Здесь нужно удалить только что нарисованное, если оно есть, но не трогать открытый рисунок...
                    //graph.Clear(Color.Empty); //так работает, но открытый рисунок исчезает
                    //-----------------------------------------------------
                    //вторая точка линии (тянется за курсором)
                    NextPositionLassoScreen = zoomPictureBox1.ClientToImagePoint(e.Location);
                    //метод рисования линии попиксельно
                    Bresenham_Line(graph, Color.Violet,
                        (int)(StartPositionLassoScreen.X), (int)(StartPositionLassoScreen.Y),
                        (int)(NextPositionLassoScreen.X), (int)(NextPositionLassoScreen.Y));
                    zoomPictureBox1.UpdateImage(canvas2);
                }
Помогите, пожалуйста, решить данную проблему. Может быть можно как-то очистить графику не цветом, а рисунком? Очень нужно...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2019, 04:34
Ответы с готовыми решениями:

Сделать так, чтобы линия "тянулась" за курсором мыши
Делаю маленький граф редактор. По щелчку мыши задаются начальные координаты, по отпусканию -конечные. Как сделать чтобы как в графических...

Как сделать так, чтобы в анимации за точкой рисовалась линия
Как сделать так,чтобы в анимации за точкой рисовалась линия?

Как сделать так, чтобы линия разрыва страницы НЕ ПРОХОДИЛА через объединенные ячейки?
Братья и сёстры, кто подскажет - как сделать так, чтобы линия разрыва страницы НЕ ПРОХОДИЛА через объединенные ячейки? Буду очень благодарен

25
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
29.10.2019, 18:09  [ТС]
Студворк — интернет-сервис помощи студентам
ashsvis, для чистоты эксперимента просто создал новый проект только с этим инструментом (+ там еще кастомный контрол). И тоже не работает countPointLasso++
Вложения
Тип файла: zip WindowsFormsApp24.zip (641.3 Кб, 6 просмотров)
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
29.10.2019, 18:27
Цитата Сообщение от Keramer82 Посмотреть сообщение
не работает countPointLasso++
У меня Ваш проект работает:
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
29.10.2019, 19:49  [ТС]
У меня срабатывает, только если перетащить окно программы...

Добавлено через 2 минуты
ashsvis, получается при MouseDown нужно перерисовать всю форму, да?
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
29.10.2019, 19:52
Keramer82, я ничего не перетаскивал, как запустилось, так и попробовал.
Единственное, сначала с помощью меню загрузил картинку, а без этого ошибку выдавало.
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
29.10.2019, 20:12  [ТС]
ashsvis, странно как-то... У меня не хочет работать, зараза такая.
Миниатюры
Как сделать так, чтобы линия "тянулась" за мышью?  
0
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
29.10.2019, 21:03  [ТС]
ashsvis, пока решил добавлением в MouseMove
C#
1
this.Refresh();
но все же как-то странно... А может это как-то зависеть от версии Visual Studio? У меня 2017.

Добавлено через 10 минут
После некоторого размышления (все-таки обновлять форму на каждое движение мыши, мне кажется, не очень хорошее решение), поставил
C#
1
this.Refresh();
в MouseDown. Постоянный показ координат курсора мыши этого не стоит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2019, 21:03

Когда двигается фон, то линия рамки тянется за ним. Как это убрать? И сделать так, чтобы рамки не было
from graph import * def gusenica(): brushColor("cornflowerblue") rectangle(0,y+0,400,y+400) brushColor("olive") ...

Как сделать так, чтобы при нажатии мышью на верхний квадратик над столбцом, он выбирал верхний закрашенный
Здравствуйте. Как сделать так, чтобы при нажатии мышью на верхний квадратик над столбцом, он выбирал верхний закрашенный шарик, и после...

Сделать так, чтобы форма не двигалась когда берут её мышью за название
здравствуйте, собственно сабж, Ворд ВБА, спасибо

Не знаю как сделать так чтобы как сделать так чтобы через каждые N строк таблицы выдача результатов останавливалась
from math import * a = -5 b = 10 up = 0.2 N = 15 x = a min_x = a max_x = b while a <= b: y = sin(x) + abs(sin(x))

Сделать так, чтобы при щелчке мышью на одной из фигурок управление передавалось на эту фигуру
здравствуйте, надеюсь на помощь, вопрос такой Дано игровое поле на катором расположено 20 фигурок (поле сделано в графическом редакторе),...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru