Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Движение контрола Добавлено: 24.05.05 18:25  

Автор вопроса:  Genetik | ICQ: 3212009 
Люди, будьте так добры. Подскажите как сделать что бы при нажатии мыши по форме в любом месте, контрл двигался к месту нажатия по прямой. Я уже себе голову сломал.

И кто знает скажите как узнать координаты мыши в момент клика по форме относительно этой формы а не всего монитора. (желательно в Твипах).
 Заранее спасибо.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #1
Добавлено: 24.05.05 21:14
И кто знает скажите как узнать координаты мыши в момент клика по форме относительно этой формы а не всего монитора. (желательно в Твипах).

Ну, это легко! Есть процедура:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub
Так вот, нужные параметры - X и Y. Единица измерения задается в свойстве ScaleMode формы.

Ответить

Номер ответа: 2
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #2
Добавлено: 24.05.05 21:19
Да код был, я давно такую штуку делал, короче берёшь разницу по осям Икс и Игрик (это типа катеты будут) а потом используй их как коэф-ты шага для смещения по вертикали и горизонтали.

Ответить

Номер ответа: 3
Автор ответа:
 Genetik



ICQ: 3212009 

Вопросов: 5
Ответов: 33
 Профиль | | #3 Добавлено: 25.05.05 00:07
По моему использовать одновременно и икс и игрик для смешения ет глупавато.(хотя я так пробовал - не совсем мне ето понравилось). Мне больше понравилась идея с алгебраической функцией y=k*x. Мол икс у тя в цикле меняется с шагом и вычисляет высоту (игрик). Потом ето вся штифня приравнивается к контролу. Но ето у меня че-то не получается. (Не могу вычислить k, хотя в учебнике написано что ето тангенс y/x).

А насчет МоусДаун сенкс. Я чё то про него совсем забыл.

Ответить

Номер ответа: 4
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #4
Добавлено: 25.05.05 01:30
2Genetik
Ты совершенно прав про тангенс и про к*х.
А как ты будешь по вертикали двигать? тангенс то там не определёёён :) разве что указать явно, что если мол X(0)=X(1) то двигаем по вертикали.

Ответить

Номер ответа: 5
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #5 Добавлено: 25.05.05 16:47
Нужно просто сделать линейную интерполяцию:
x = x1 + (x2 - x1) * k
y = y1 + (y2 - y1) * k

Ответить

Номер ответа: 6
Автор ответа:
 Genetik



ICQ: 3212009 

Вопросов: 5
Ответов: 33
 Профиль | | #6 Добавлено: 26.05.05 23:23
А как ты определял координату Y еще в школе? Правильно, подставлял определенную Х. Так и здесь. Т.е. в цикле или таймером ты вычисляеш значение Y подстанавливая Х в формулу(например Х с шагом 10).

Ответить

Номер ответа: 7
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #7
Добавлено: 26.05.05 23:31
y=k*x

это ж функция,а сколько значений Y соотв-т каждому X если это функция? => можешь по вертикали двигать?

Ответить

Номер ответа: 8
Автор ответа:
 Genetik



ICQ: 3212009 

Вопросов: 5
Ответов: 33
 Профиль | | #8 Добавлено: 27.05.05 10:07
Каждому Х соответствует единственное значение У. Например если формула У=2Х То при Х=2 У=4. И больше ничему, только 4.

Ответить

Номер ответа: 9
Автор ответа:
 Genetik



ICQ: 3212009 

Вопросов: 5
Ответов: 33
 Профиль | | #9 Добавлено: 28.05.05 22:01
Все, проблема решена.

'На форме (form1) одна кнопка (Command1) и таймер (timer1)
Option Explicit
Dim x_, xt As Long
Dim y_, yt As Long
Dim tekx As Integer
Dim teky As Integer
Private Sub Form_Load()
    Form1.AutoRedraw = True
    Form1.Width = 7000
    Form1.Height = 6000
    Command1.Left = 0
    Command1.Top = 0
    Timer1.Enabled = False
    Timer1.Interval = 1
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim speed As Integer
    speed = 500
    tekx = Command1.Left
    teky = Command1.Top
    x_ = X
    y_ = Y
    xt = Abs(tekx - X)
    yt = Abs(teky - Y)
    xt = (xt / speed)
    yt = (yt / speed)
    Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
    If tekx < x_ Then
        tekx = (tekx + xt)
    ElseIf tekx > x_ Then
        tekx = (tekx - xt)
    End If
    If teky < y_ Then
        teky = (teky + yt)
    ElseIf teky > y_ Then
        teky = (teky - yt)
    End If
    Command1.Left = tekx
    Command1.Top = teky
    If Abs(teky - y_) <= yt Then
        If Abs(tekx - x_) <= xt Then
            Timer1.Enabled = False
        End If
    End If
End Sub


Код любезно представлен JohnCR, за что ему огромное спасибо!!!

ЗЫ: Morpheus извини, ты был прав! Линейная функция бред.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам