Tips: creando el efecto Drag & Drop

En algunas ocasiones necesitamos
arrastrar dentro de nuestro programa algún tipo de objeto y con ello realizar
alguna acción determinada. El otro día estaba construyendo un programilla para
crear diagramas y algunas de las figuras que integro en estos diagramas no
pueden ser simples dibujos, sino que se tiene que poder añadir texto, responder
a acciones, y además tienen que ser movidos por toda la ventana. Esto último
implica una acción denominada “Drag & Drop” o nuestro idioma “arrastrar y colocar”.

Como de vez en cuando se me lía
la cabeza y hago las cosas un poco difíciles XD, este truco no va de cómo
utilizar el evento “DragDrop”, sino de cómo crear
el efecto
, utilizando los eventos del ratón.

Lo primero de todo es tener
seleccionado el objeto que quieras mover por la ventana, te vas a sus
propiedades y pinchas en el icono del rayo. Nos colocamos (XD) en la sección de
Mouse y tenemos que hacer doble clic en los eventos de MouseDown, MouseUp y
MouseMove. La cosa quedaría de esta forma:

                                                                             

 

Ahora lo que tenemos que hacer es
añadir el siguiente código al control:

Boolean var; //Una
variable booleana
Point
a;  //Otra variable de tipo coordenada (x,y)

 Las variables van declaradas
al principio de la clase, y dentro de los métodos que hemos creado vamos
escribiendo lo que viene a continuación:

 private void control_MouseDown(object sender, MouseEventArgs
e)
 {

    var = true;
    a = e.Location;
 }

 Con
las dos líneas anteriores simplemente ponemos la variable booleana a cierto
para indicar que se ha clickado el botón del ratón y le damos a la variable “a”
la posición del puntero del ratón.

private void control_MouseMove(object sender, MouseEventArgs
e)

{
    if (var == true)

    {
        this.Left = e.X + this.Left;
        this.Top =
e.Y + this.Top;
   
}
}

Cuando
se clicka le voy dando la distancia que se mueve el objeto en x e y, y la
posición que tenía anteriormente.

private void control _MouseUp(object sender, MouseEventArgs
e)

{
    var = false;
}


Por ultimo cuando levanto el dedo
del ratón vuelvo a poner el booleano a falso.

Creo que es más efectivo utilizar
el evento que viene de DragDrop pero esto es a modo de curiosidad más que nada
que me aburría estudiando y entre lo que lees en Internet, lo que imagino y lo
que luego sale, armo de cada que no veas.

Un saludete