Como mover un boton (Drag and Drop) en Visual Basic .NET (vb.net)

Hola amigos.

Pues hace unos años me toco estar en Medios Didácticos en donde tuve que pasar ciertas pruebas para lograr estar ahí ayudandoles con las programaciones :P y ahi uno de los programas que tuve que hacer fue de poder arrastrar un boton con el mouse en tiempo de ejecución (esto se podría usar para hacer programas multimedia, juegos interactivos o cualquier cosa que se te ocurra); la diferencia fue que en ese entonces lo hice en el Macromedia Director (ahorita no se si siga existiendo) y pues hoy en este rato que no tenía nada que hacer se me ocurrio hacerlo nuevamente pero en Visual Basic .NET (ya que lo acabo de aprender en la escuela) y aquí esta el codigo resultante:

NOTA: mas abajo lo explico paso a paso…

[vbnet]
Public Class Form1
Dim Moviendose As Boolean = False ‘bandera que nos dirá si el user ya presiono el clic dentro del mouse… por lo tanto se iniciará el movimiento
Dim PrimeraMovida As Boolean = False ‘Como el evento MouseMove se repite constantemente cada vez que detecta el movimiento del mouse, esta bandera nos dira si es la primera vez que se detecta el movimiento despues de presionar el mouse
Dim posicionInicialCursorX = 0 ‘contendrá la posicion del cursor en “X” exactamente despues de que se presiona el mouse y antes de que se comience a mover el mouse
Dim posicionInicialCursorY = 0 ‘contendrá la posicion del cursor en “Y” exactamente despues de que se presiona el mouse y antes de que se comience a mover el mouse

Private Sub btn_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles boton.MouseDown
Moviendose = True ‘como se presiono el mouse, se iniciará el movimiento del boton
End Sub

Private Sub btn_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles boton.MouseUp
Moviendose = False ‘como se soltó el mouse, se detendrá el movimiento del boton
PrimeraMovida = False ‘reiniciamos la bandera
End Sub

Private Sub btn_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles boton.MouseMove
If (Moviendose = True) Then ‘Sí se esta moviendo el mouse, entonces:
If (PrimeraMovida = False) Then ‘Sí es la primera movida despues de presionar el mouse, entonces:
PrimeraMovida = True ‘igualamos la bandera a true para que no vuelva a entrar aquí
posicionInicialCursorX = e.X ‘obtenemos la posicion del cursor en X al inicarse el movimiento
posicionInicialCursorY = e.Y ‘obtenemos la posicion del cursor en Y al inicarse el movimiento
End If

Me.Text = “Drag And Drop X=” & e.X + boton.Location.X – posicionInicialCursorX & ” Y=” & e.Y + boton.Location.Y – posicionInicialCursorY ‘Solo para darnos una idea de lo que sucede
boton.Location = New Point(e.X + boton.Location.X – posicionInicialCursorX, e.Y + boton.Location.Y – posicionInicialCursorY) ‘reposisionamos el boton en las nuevas coordenadas
End If
End Sub
End Class
[/vbnet]

Y bueno, al correrlo te debería quedar algo como esto :

Ahora deja te lo explico brevemente (aunque el codigo esta totalmente comentado)… En teoría, esto es lo que hacemos

  • Primero lo que sucede cuando uno desea arrastrar un boton, es colocarte sobre él y dar click, despúes comienzas a mover el mouse. Bueno pues nosotros es lo que intentamos simular.
  • Sabiendo esto, lo primero que necesitamos hacer es saber si el ususario ya ha presionado click dentro del boton. Esto, porque nuestro codigo solo iniciará a ejecutarse cuando el user presione click sobre el boton (ya que nuestro codigo estará en el evento “MouseMove” el cual es lanzado cuando el mouse se esta moviendo encima del boton, pero ¿que tal si el usuario solo esta moviendo el mouse por encima de éste pero no desea arrastrarlo? para eso, hemos usado una bandera llamada “Moviendose” la cual nos indica si el usuario ya ha presionado click sobre el boton. Sí esta bandera es igual a “true” significa que el user ya ha presionado el boton, por lo tanto ejecutaremos nuestro codigo)
  • Ahora lo primero que tenemos que hacer despues de que el usuario presionó el boton, es obtener las coordenadas del puntero (cursor), ya veras para que. Estas coordenadas solo se obtendrán una vez por arrastre (es decir que se obtendrán solo al inicio de que se comienza a arrastrar el boton y no se volverán a obtener hasta que el usuario alla terminado de arrastrar el boton, soltar el click, y volver a presionar click sobre el boton). Para saber si es el inicio de la arrastrada del boton, usaremos una bandera llamada “PrimeraMovida”.
  • Bueno, teniendo en cuenta esto, ya solo nos queda estar reposicionando el boton dependiendo de la posición nueva del cursor. Esto lo hacemos en el evento “MouseMove” para que cada vez que vb.net detecte que se esta moviendo el cursor encima del boton, cambiar las coordenadas del boton para que se coloque a una nueva posicion proporcional a la nueva posición del cursor (provocando el efecto de movimiento del mouse a la par del cursor)
  • Observa esta imágen y veras como hago el reposicionamiento del boton respecto del mouse.


Espero y todo te alla quedado claro :P cualquier cosa comentala aquí porfa jeje.. Aquí te dejo los archivos para que los descargues:

Descargas

Archivos

Share Button
Latest Comments

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *