powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / стрелки - как реализовать
20 сообщений из 20, страница 1 из 1
стрелки - как реализовать
    #38060689
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго Вам времени суток
Уважаемые господа

при наличии времени прошу Вас подсказать
мне необходимо в программе реализовать возможность рисования стрелок разного вида (векторных стрелок)

например

пользователь производит клик на форме
и удерживая левую клавишу мыши тянет курсор в нужном направлении
и в этот момент за курсором движется стрелка
там где левая клавиша будет отпущена, прорисовка стрелки завершается

понимаю что здесь нужно:
знать начальную позицию курсора - где происходит клик левой клавиши мыши
знать конечную точку - где левая клавиша мыши будет отпущена
должен быть рисунок (массив) с нужным видом стрелки - который будет выбирать пользователь

а вот как это реализовать я не знаю

подскажите где можно почитать по этому поводу, может есть пример этого


С Уважением
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060721
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, Намик!

Собственно на форме нужно отследить событие MouseDown и запомнить координату начала стрелки.
Затем следить за событием MouseMove, перерисовывая стрелку от начала до курсора.
На событии MouseUp прекращать рисовать стрелку.

Вопрос, как рисовать эту стрелку. Растровый вариант тут не совсем подходит, так как картинка должна быть расположена под произвольным углом. Можно рисовать с помощью контрола Line стрелку по координатам, но тут вопрос, какие требования предъявляются к библиотеке стрелок - возможно, они слишком вычурные для такого способа.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060728
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую Вас Shocker.Pro

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

однако удаление этих стрелок должно происходить полностью
я имею ввиду следующее
например нарисовал стрелку одну потом вторую и вот нужно удалить первую - прикоснулся к ней и она полностью удалилась (т.е. ты её не стираешь шаг за шагом)

вот такое надо

С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060733
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все мелочи.
Удалять стрелку можно будет, отслеживая событие Click на линиях, входящих в стрелку. Добиться удаления всех линий, входящих в стрелку можно будет соглашением об именах этих линий (к примеру Line1_25, Line2_25 и Line3_25 - клик по любой из них должен удалить все три линии).

Меня больше смущает это:
Namikдолжен быть рисунок (массив) с нужным видом стрелкиповторю, если стрелку можно нарисовать с помощью нескольких линий - это одно, если же требуется работа с растром - это сильно усложняет задачу.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060736
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а
тогда я не правильно Вас понял

пусть будет прорисовка через Line

но тогда как пользователь будет выбирать стрелку которую захочет нарисовать ?

С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060743
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это тема отдельная.
Допустим будет пять видов стрелок.
Под них нужно будет написать пять алгоритмов отрисовки (пять процедур, которые на входе получают координаты начала и конца стрелки и рисуют ее).
Этими же алгоритмами где-нить в углу формы отрисовываются все пять образцов и лепится простенький блок optionbutton для выбора варианта.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060745
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можете показать пример одной прорисовки линии ?
а я уже попробую остальное


С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060755
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм. Возникла некоторая сложность.
Я предполагал использовать событие Click на объекте Линия для ее удаления. Но у нее оказывается нет событий (не сталкивался раньше). Если нужно удалять линию щелком по ней, придется крепко подумать, как это лучше реализовать.
Создать линию можно так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
With Me.Controls.Add("VB.Line", "Line333", Me)
  .X1 = 500
  .Y1 = 400
  .X2 = 1500
  .Y2 = 1000
  .BorderWidth = 3
  .Visible = True
End With

удалить так
Код: vbnet
1.
Me.Controls.Remove "Line333"
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060757
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю Вас

сейчас попробую
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060766
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
а стрелка - конус на конце не получается да ?


С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060814
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот Shocker.Pro сделал так

Код: vbnet
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.
Dim xper As Integer
Dim yperv As Integer
Dim xvtor As Integer
Dim yvtor As Integer
Dim countline As String


Private Sub Command2_Click()
Me.Controls.Remove "?"
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
xvtor = X
yvtor = Y
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
xper = X
yperv = Y
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim zeko As String

countline = Val(countline) + 1

zeko = "Line" + countline
With Me.Controls.Add("VB.Line", zeko, Me)
  .X1 = xper
  .Y1 = yperv
  .X2 = xvtor
  .Y2 = yvtor
  .BorderWidth = 12
  .BorderColor = vbRed
  .Visible = True
End With
End Sub



теперь как при наведении курсора на какую нибудь линию узнать её имя чтобы удалить

С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38060829
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Namikа стрелка - конус на конце не получается да ?ну так ее тоже надо нарисовать еще двумя-тремя линиями.
Namikтеперь как при наведении курсора на какую нибудь линию узнать её имя чтобы удалитьПросто - никак. Она, фактически, не является объектом, у нее нет событий, поэтому я и сказал, что возникла сложность.

Поэтому, если хочется сделать быстрее, может быть обдумать альтернативный вариант удаления. К примеру, каждая новая линия рисуется своим цветом. Одновременно где-нить в углу формы появляется кнопочка соответствующего цвета, которая удаляет эту линию. Либо кнопочка лепится около, скажем, начала каждой линии.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061034
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
доброго времени суток Shocker.Pro
а если ластик стирающий эту линию ? то в этом случае цвет фона должен быть всегда однородным да ?

С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061052
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда ее надо в принципе рисовать иначе - с помощью графических методов, да, тут и с фоновой картинкой начинаются проблемы.
В общем опять же вопрос, хочется это сделать быстро без геморроя или хочется повозиться потратить кучу времени и сил.

Как промежуточный вариант - можно ловить клик мышью на форме и чисто математическими методами вычислять, попадают ли какие-то стрелки в эти координаты.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061054
Namik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую Вас

Shocker.Pro Либо кнопочка лепится около, скажем, начала каждой линии.

подскажите примером как реализовать эту кнопочку рядом с каждой линией ?

С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061077
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал на базе Вашего кода
Правда не понял, зачем вы использовали MouseMove, если не собирались перерисовывать линию в процессе растягивания, как я предлагал, сделал, чтобы линия рисовалась в процессе.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061108
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в
Код: vbnet
1.
Unload Me.btDel(CStr(Index))

функция CStr конечно лишняя, случайный копипаст
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061502
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя подключить какую-нибудь готовую библиотеку шейпов (ну, например, как "рисование" в Офисе) и воспользоваться?
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061892
Vladimer-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда подводиш курсор к точки то проверка условия если кординаты мыши равны кординатам линии то линиу удалять.
...
Рейтинг: 0 / 0
стрелки - как реализовать
    #38061908
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimer-M,

Сам подумал,зачем влез? "Координаты линии" - это, в большинстве случаев, две (три) координаты пары начало/конец линии, "координаты точки" - это еще две (три) просто координаты. Плюс ещё (в вышеприведенном варианте) имеются "две линии, изображающие стрелку". Что сравнивать? Не забудь, что в векторном варианте - целочисленных и совпадающих "координат" вообще может не быть...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / стрелки - как реализовать
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]