Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / стрелки - как реализовать / 20 сообщений из 20, страница 1 из 1
30.11.2012, 22:49
    #38060689
Namik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
стрелки - как реализовать
Доброго Вам времени суток
Уважаемые господа

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

например

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
01.12.2012, 00:45
    #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
01.12.2012, 00:46
    #38060757
Namik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
стрелки - как реализовать
Благодарю Вас

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


С Уважением и Благодарностью
Намик
...
Рейтинг: 0 / 0
01.12.2012, 01:47
    #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
01.12.2012, 02:10
    #38060829
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
стрелки - как реализовать
Namikа стрелка - конус на конце не получается да ?ну так ее тоже надо нарисовать еще двумя-тремя линиями.
Namikтеперь как при наведении курсора на какую нибудь линию узнать её имя чтобы удалитьПросто - никак. Она, фактически, не является объектом, у нее нет событий, поэтому я и сказал, что возникла сложность.

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

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

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

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

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

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

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

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


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