powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перемещать Image
32 сообщений из 32, показаны все 2 страниц
Перемещать Image
    #37865994
Подскажите как сделать что бы Image можно было перемещать только по линии? И как вообще таскать Image мышкой?
...
Рейтинг: 0 / 0
Перемещать Image
    #37866009
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На MouseDown на этом Image запоминать текущие координаты
На MouseMove изменять координаты Image в соответствии с разницей изменения координат мыши относительно MouseDown
На MouseUp прекращать обработку
...
Рейтинг: 0 / 0
Перемещать Image
    #37866031
Shocker.Pro,

Спасибо. Сделал.
А как сделать чтобы только по линии перемещать?
...
Рейтинг: 0 / 0
Перемещать Image
    #37866048
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чистая математика. Координаты после вычисления надо приводить к координатам линии. То есть мы знаем - линия проходит по координатам 1:1, 2:2, 3:3, 4:4. А мышь выдала координаты 6:8. Приводим их к 6:6.

например.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866162
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перемещать ImageСпасибо. Сделал.Проверил хоть? Этот код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Image1.Left = X - (Image1.Width / 2)
Image1.Top = Y - (Image1.Height / 2)

End If
End Sub

никогда не сработает. Курсор все время будет над Image, а не над формой.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866165
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я проверил. Работает. )
...
Рейтинг: 0 / 0
Перемещать Image
    #37866179
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Image ползает исключительно вдоль линии? Его невозможно утащить в сторону?
Не верю, проект в студию.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866184
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyImage ползает исключительно вдоль линии?Нет, читай топик сначала. Пока автор сделал (какой молодец без лишних глупых вопросов) движение за мышью. Теперь он думает над тем, как сделать вдоль линии.

ЗЫ: Я в первом посте ответил на второй его вопрос, а не на первый, это я не указал, виноват
...
Рейтинг: 0 / 0
Перемещать Image
    #37866233
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПеремещать ImageСпасибо. Сделал.Проверил хоть? Этот код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Image1.Left = X - (Image1.Width / 2)
Image1.Top = Y - (Image1.Height / 2)

End If
End Sub

никогда не сработает. Курсор все время будет над Image, а не над формой.А вообще-то работает.
Нипонял...

Хотя это можно и без кода сделать.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866253
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понял. Если нажать мышкой вне image и начать движение, он подтянется к курсору, а форма продолжит получать MouseMove. Если же по Image, то не работает.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866254
Я пока только до этого додумался. Но что делать если линия ломаня будет и с петлями и если Image утащить ниже линии - не знаю.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866283
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но что делать если линия ломаня будет и с петлямиДелить на участки, каждый участок это график отдельной функции. В каждом участке (или в нескольких, если они пересекаются) вычисляются координаты пересечения нормали к графику функции и ее длина (от курсора до пересечения). Какая нормаль оказалась короче, к тому пересечению и лепим image.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866284
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ты делай нужные расчеты не в MouseUp, а в MouseMove
...
Рейтинг: 0 / 0
Перемещать Image
    #37866298
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока только до этого додумался.Это тупик. Нужно сабклассить форму, без этого после захвата image mouse-событий на форме не дождешься. Там же можно ограничить перемещения самого курсора, не только image. В стандартной vb-модели событий этого не сделаешь без дёрганий.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866313
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЭто тупик. Нужно сабклассить формуДа нафига? Надо просто отслеживать события не на форме, а на Image1
...
Рейтинг: 0 / 0
Перемещать Image
    #37866331
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyЭто тупик. Нужно сабклассить формуДа нафига? Надо просто отслеживать события не на форме, а на Image1Какие?
...
Рейтинг: 0 / 0
Перемещать Image
    #37866354
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все те же - MouseDown, MouseMove, MouseUp.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866382
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proвсе те же - MouseDown, MouseMove, MouseUp.AntonariyНужно сабклассить форму, без этого после захвата image mouse-событий на форме не дождешься .
Какое из выделенных слов не понятно?

Сабклассить, впрочем, не обязательно, но желательно. Вот минимальный рабочий вариант:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Explicit

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
    Source.Left = X - (Image1.Width / 2)
    Source.Top = Y - (Image1.Height / 2)
End Sub

Private Sub Form_Load()
    Me.Line (10, 10)-(600, 600), vbBlack
    Image1.Left = 10
    Image1.Top = 10
    
    Image1.DragMode = vbAutomatic
End Sub
...
Рейтинг: 0 / 0
Перемещать Image
    #37866385
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочка.
Код: vbnet
1.
2.
    Source.Left = X - (Source.Width / 2)
    Source.Top = Y - (Source.Height / 2)
...
Рейтинг: 0 / 0
Перемещать Image
    #37866387
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAntonariyНужно сабклассить форму, без этого после захвата image mouse-событий на форме не дождешься .
Какое из выделенных слов не понятно?А зачем мне захватывать Mouse-события на форме? Задача стоит - таскать Image и именно событиями Image все и ограничится
...
Рейтинг: 0 / 0
Перемещать Image
    #37866402
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА зачем мне захватывать Mouse-события на форме? Задача стоит - таскать Image и именно событиями Image все и ограничитсяОк. Как определишь текущие координаты курсора относительно формы?
...
Рейтинг: 0 / 0
Перемещать Image
    #37866409
AntonariyКак определишь текущие координаты курсора относительно формы?
Да с этим как раз и засада у меня сейчас.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866410
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.ProА зачем мне захватывать Mouse-события на форме? Задача стоит - таскать Image и именно событиями Image все и ограничитсяОк. Как определишь текущие координаты курсора относительно формы?А мне они не нужны )
...
Рейтинг: 0 / 0
Перемещать Image
    #37866428
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyпропущено...
Ок. Как определишь текущие координаты курсора относительно формы?А мне они не нужны )я посмотрел алгоритм, да, теоретически там есть недостаток, если мышь двинется так резко, что выскочит за пределы Image, то Image "потеряется". Но практически обходилось только движением мыши внутри объекта, никто не разу не жаловался
...
Рейтинг: 0 / 0
Перемещать Image
    #37866458
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyпропущено...
Ок. Как определишь текущие координаты курсора относительно формы?А мне они не нужны )Показывай.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866465
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПоказывай.
Код: 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.
Option Explicit

Private Drag As Boolean
Private StartX As Long
Private StartY As Long

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If (Button & vbLeftButton) <> 0 Then
  Drag = True
  StartX = X
  StartY = Y
End If

End Sub
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Drag Then
  Command1.Left = Command1.Left + (X - StartX)
  Command1.Top = Command1.Top + (Y - StartY)
End If


End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Drag = False

End Sub
...
Рейтинг: 0 / 0
Перемещать Image
    #37866471
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, таки-да, это просто-напросто не подойдет для решения задач автора... хотя... можно таскать невидимый Image, а другой параллельно размещать на графике
...
Рейтинг: 0 / 0
Перемещать Image
    #37866481
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я и думал. Много букв + код будет нормально работать только с контролами конских размеров. И если кнопка нажалась достаточно далеко от края.
Shocker.Proхотя... можно таскать невидимый Image, а другой параллельно размещать на графике+ еще больше букв.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866503
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, сабклассинг гораздо меньше букаф.

Еще раз - ПРАКТИЧЕСКИ этот код работает отлично, никто не жаловался. Теоретически - можно рассуждать долго.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866530
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProАга, сабклассинг гораздо меньше букаф. Это если нужно ограничивать движения самого курсора.
Просто не сразу вспомнил про драгдроп.
...
Рейтинг: 0 / 0
Перемещать Image
    #37866539
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПросто не сразу вспомнил про драгдроп.ну там тоже придется дописать код, чтобы имидж на точку дропа не падал пупком
...
Рейтинг: 0 / 0
Перемещать Image
    #37866649
Даже не ожидал, что вызову такое обсуждение моего вопроса!
Спасибо за помощь.
Сейчас нет возможности применить и опробовать все на практике. За втра надеюсь у меня всё получится благодаря помощи обитателей форума:)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перемещать Image
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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