Программирование
Веб программирование

Перемещение объекта на форме с помощью мыши

 
 

Приветствую всех!!!

Рассмотрим пример, как можно перемещать объект по форме с помощью мыши. В качестве объекта возьмем PictureBox.  

  1. Создайте проект и помесите на форму объект  PictureBox1.  В свойстве Image поместите в объект какую-нибудь картинку и выровняйте границы объекта  до размеров рисунка.
  2. Создадим заготовку для кода. Нам потребуется процедура загрузки формы. Дважды щелкните мышкой на форме Form1. Автоматически создастся процелура загрузки. Поместите в нее следующий код:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        i_mouse = 0
        pozx = 0.5 * PictureBox1.Width
        pozy = 0.5 * PictureBox1.Height
    End Sub

Нам потребуются так же процедуры событий нажатия и отпускания левой кнопки мышки и движение на PictureBox1.  Выделите на форме PictureBox1., --> щелкните правой кнопкой мышки--> выберите свойства. В окне свойства выберите вкладку события (она обозначена значком «молния»). В меню события выберите, например событие MouseDownи дважды щелкните мышкой на этой строчке. Это приведет к созданию процедуры Sub PictureBox1_MouseDown. Аналогично создайте процедуры  Sub PictureBox1_MouseUp и Sub PictureBox1_MouseMove. Введите код в эти процедуры, как показано ниже. Окончательно код будет выглядет так:

Public Class Form1

    Dim i_mouse, pozx, pozy
    'i_mouse - индекс, показывающий нажата или отжата левая кнопка мыши
    'pozx, pozy- координаты курсора на картинке.

 Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        i_mouse = 1
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        i_mouse = 0 'Нач. значение - клавиша мышки отжата
        pozx = 0.5 * PictureBox1.Width 'х-Центр картинки
        pozy = 0.5 * PictureBox1.Height 'У-Центр картинки
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim mouseX As Integer = e.X 'Текущая Х-координата на картинке
        Dim mouseY As Integer = e.Y 'Текущая У-координата на картинке

        If i_mouse = 1 And mouseX >= pozx - 10 And mouseX <= pozx + 10 Then
            'Смещение картинки на форме по Х, если нажата клавиша мыши и есть перемещение
            PictureBox1.Left = PictureBox1.Left + mouseX - 0.5 * PictureBox1.Width
            pozx = mouseX
        End If

        If i_mouse = 1 And mouseY >= pozy - 10 And mouseY <= pozy + 10 Then
            'Смещение картинки на форме по Y, если нажата клавиша мыши и есть перемещение
            PictureBox1.Top = PictureBox1.Top + mouseY - 0.5 * PictureBox1.Height
            pozy = mouseY
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        i_mouse = 0
    End Sub

End Class

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


Есть вопросы? Спроси на нашем форуме!!
Release130 [21.02.2013 21:35]

Есть проще вариант.

pjp07190 [22.02.2013 10:44]

Спасибо за содержательный ответ.

geranazavr555100 [25.02.2013 20:18]

Мне кажется, или ВБ.нет очень похож на вб6?
В шестом код аналогичной проги выглядит почти также.

Coolhacker770 [25.02.2013 21:06]

Очень похож. Там собсна в плане синтаксиса языка изменений было мало. Поменяли платформу, сменили оную на .NET, под нужды платформы подогнали синтаксис, а идея осталось та же. Так что не мудрено, что похоже. А ты ждал что из бейсика Haskell сделали?)

Кстати хочу сказать, что у языка ВБ очень хороший и емкий синтаксис. Отнюдь, я уж привык к плюсам да шарпу. Тут значит далее маленькая отсебятина:
Коли синтаксис ВБ так уж похож на аглицкий язык, то надо было делать аглицким до конца, как, экзампл, AppleScript, то бишь не

If a = b Then
....
End If

А

If a Equals b Then
....
End If
(да, да, опять Equals, да простит меня лайсо)

Ну и конструкция "If imouse = 1 And mouseY >= pozy - 10 And mouseY <= pozy + 10 Then" выглядела бы так:

If i
mouse Equals 1 And MouseY MoreOrEquals pozy - (или Subtract :D) 10 And mouseY LessOrEquals pozy + (или Add :D) 10 Then

Вот такой вот ужас, зато местами удобно).

EverybodyLies280 [27.02.2013 11:35]

и снова я вижу твою безумную идею насчет equals)

M161350 [12.07.2013 14:09]

А как такое на VB6 сделать?

alex13sh300 [12.07.2013 14:59]

M161, Точно также, Абсолютно так же. ток синтаксис vb6 использовать, а алгоритм такой же

Есть ещё надёжный способ претаскиваниие объектов - это АПИ, использутся это функция в основном для перетаскивание форму за люболе место, про это куча уроков

Release130 [12.07.2013 18:14]

alex13sh, напиши такой урок, думаю M161 будет благодарен тебе.

alex13sh300 [12.07.2013 21:57]

Release, лан)
Ток я нелюблю урок списывать, с простой заменной подчерка))

Release130 [12.07.2013 22:38]

А кто говорит о списывании? Напиши урок по своим знаниям! Только при написании оформляй все красивенько!

alex13sh300 [13.07.2013 00:00]

Готово)



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.