none
ARRASTRAR Y SOLTAR DE FORMA PRECISA

    Question

  • namespace AS1
    {
        public partial class Form1 : Form
        {
            int xini, yini;        
    
            public Form1()
            {
                InitializeComponent();
    
                
            }
    
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                pictureBox1.DoDragDrop(pictureBox1, DragDropEffects.Move);
                xini = pictureBox1.Location.X;
                yini = pictureBox1.Location.Y;                      
                
            }
    
            private void Form1_DragOver(object sender, DragEventArgs e)
            {
                
                Point origen = new Point(e.X-xini, e.Y-yini);
                pictureBox1.Location = origen;
                
               
            }
    
            
           private void Form1_DragDrop(object sender, DragEventArgs e)
            {
               
                Point origen = new Point(e.X, e.Y);
                pictureBox1.Location = origen;
            }
        }
    }
    
    Hola a tod@s.

    Soy nuevo en programacion con C# y estoy probando cosas basicas, concretamente lo que quiero ahora es poder arrastrar y soltar algun control en tiempo de ejecucion.En verdad lo  tengo hecho pero funciona malamente.
    Se trata de una aplicacion tonta en la que aperece un picturebox con una imagen cargada y lo unico que quiero es poder moverla con drag-drog por el formulario.Como ya he dicho funciona pero no como a mi me gustaria, el problema es que al empezar a arrastrar el picture box me gustaria que este se moviese en armonia con el cursor del raton pero en su lugar el picturebox se va para un lado y el cursor del raton para otro aunque luego si se puede mover dicho picturebox.
    La verdad es que no tego muy claro los eventos que hacen falta para implementar lo de arrastrar y soltar ya que el codigo que tengo funciona de igual manera con el evento  Form1_DragDrop que sin el.

    Gracias y saludos

     

    Monday, May 04, 2009 5:38 PM

Answers

  • Hola Desprogramador.

    Los eventos drag and drop estan pensados mas bien para arrastrar controles y acoplarlos en contenedores.
    Yo para realizar lo que quieres hacer, me baso en la antigua usanza, el control mediante las posiciones relativas.

    Te pongo un ejemplo:

       public partial class Form1 : Form
        {
            private bool btnDown;
            private int offsetX;
            private int offsetY;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                // el boton izquierdo esta pulsado
                if (e.Button == MouseButtons.Left)
                {
                    btnDown = true;
                    offsetX = e.X;
                    offsetY = e.Y;
                }
            }
    
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (btnDown)
                {
                    // mover el pictureBox con el raton               
                    pictureBox1.Left += e.X - offsetX;
                    pictureBox1.Top += e.Y - offsetY;
                }
            }
    
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                // el boton izquierdo se libera
                if (e.Button == MouseButtons.Left)
                {
                    btnDown = false;
                }
            }
        }

    De esta forma registro los offsets al pulsar con el boton sobre el control, ya que la posicion del mouse es relativa al control, luego en el evento 'mousemove' hago los calculos pertinetes para posicionar relativo al offset.
    El control del boton lo registro mediante un flag para ver si esta pulsado o no.

    Esta es una de las formas.

    Espero te sirva de ayuda o guia para lo que quieres realizar

    Saludos.
    Monday, May 04, 2009 6:51 PM

All replies

  • Hola Desprogramador.

    Los eventos drag and drop estan pensados mas bien para arrastrar controles y acoplarlos en contenedores.
    Yo para realizar lo que quieres hacer, me baso en la antigua usanza, el control mediante las posiciones relativas.

    Te pongo un ejemplo:

       public partial class Form1 : Form
        {
            private bool btnDown;
            private int offsetX;
            private int offsetY;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                // el boton izquierdo esta pulsado
                if (e.Button == MouseButtons.Left)
                {
                    btnDown = true;
                    offsetX = e.X;
                    offsetY = e.Y;
                }
            }
    
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (btnDown)
                {
                    // mover el pictureBox con el raton               
                    pictureBox1.Left += e.X - offsetX;
                    pictureBox1.Top += e.Y - offsetY;
                }
            }
    
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                // el boton izquierdo se libera
                if (e.Button == MouseButtons.Left)
                {
                    btnDown = false;
                }
            }
        }

    De esta forma registro los offsets al pulsar con el boton sobre el control, ya que la posicion del mouse es relativa al control, luego en el evento 'mousemove' hago los calculos pertinetes para posicionar relativo al offset.
    El control del boton lo registro mediante un flag para ver si esta pulsado o no.

    Esta es una de las formas.

    Espero te sirva de ayuda o guia para lo que quieres realizar

    Saludos.
    Monday, May 04, 2009 6:51 PM
  • Muchas gracias David

    Eso va como la seda y ademas lo entiendo :-)
    Lo que no tengo claro es eso de los contenedores para arrastrar los controles, ¿que son?.
    Lo que a mi me haria falta seria ir creando tantos  picturebox como quiera el usuario en tiempo de ejecucion e ir arrastrandolos  y soltandolos en un picturebox que hay fijo en el form1. ¿Que tecnica debo de seguir la de drag-drop o la que me has enseñado?

    Gracias nuevamente y saludos.
    Tuesday, May 05, 2009 3:18 PM
  • hola de nuevo.

    Para hacer lo que quieres puedes usar ambas tecnicas, quizas sea mas facil con drag and drop ya que no solo quieres mover un control, si no que quieres acoplarlo en un contenedor.
    Para que te hagas una idea el drag and drop es la tecnica usada en el explorer cuando arrastras archivos dentro de carpetas.

    si te das cuenta el evento'DragDrop' contiene el argumento 'DragEventArgs' con funcionalidades diferentes a las del raton.

    Si lo que quieres es acoplar un elemento sobre otro (que hace de contenedor) lo ideal es usar Drag and Drop, si te fijas en la clase 'DragEventArgs' existe una propiedad que se llama 'Effect' que es el efecto obtenido de arrastrar un elemento, a esta propiedd se le puede asignar cualquier variable de la enumeracion 'DragDropEffects', que son( copiar, pegar, linkar,etc.) y este sera el resultado que se obtendra al arrastrar.

    Visto esto si tienes una imagen y la arrastras hasta un contenedor (como un picturebox) con el efecto copiar, la imagen se copiara y la original seguira en su sitio. Esto te ofrece la misma funcionalidad que cualquier elemento del explorer o escritorio de windows.

    Haber si tengo un poco de tiempo y puedo poner un ejemplillo con lo visto hasta ahora.

    Saludos David González
    Tuesday, May 05, 2009 5:49 PM
  • He estado mirando el drag and drop, pero tengo un vista y tengo problemas para usarlo, solo me funciona si ejecuto la aplicacion sin depurar, debe existir algun problema derivado de la UAC.

    en cualquier caso te paso un ejemplo que he encontrado en la red, pero lo realizan con imagenes contenidas en un label.

    te pongo el link del ejemplo y miras que opciones te convienen mas dependiendo de los controles que vayas a usar.

    http://www.java2s.com/Code/CSharp/GUI-Windows-Form/DraganddropthePictureBox.htm

    ya me diras como te ha ido.
    Saludos David González
    Tuesday, May 05, 2009 6:48 PM
  • Hola de nuevo David.

    Gracias por los ejemplos, el unico que he conseguido que rule es un practicamente igual que la solucion que tu me diste. Tambien busco ejemplos por mi cuenta pero no encuentro gran cosa sobre este tema.

    Lo que me ha dejado en duda es lo de que el picturebox no admite DoDragDrop ya que yo lo he utilizado(y funciona, mal pero funciona),de hecho esta en el codigo que deje al principio de esta conversacion. Lo mismo funciona malamente por lo que tu dices, quizas no se debe de utilizar en los picturebox.

    Por cierto, una pregunta que no tiene que ver con el tema, ¿se pueden subir fotos en el foro?

    Gracias y Saludos
    Wednesday, May 06, 2009 3:34 PM

  • Lo que me ha dejado en duda es lo de que el picturebox no admite DoDragDrop ya que yo lo he utilizado(y funciona, mal pero funciona),de hecho esta en el codigo que deje al principio de esta conversacion. Lo mismo funciona malamente por lo que tu dices, quizas no se debe de utilizar en los picturebox.


    Si, perdona por el lapsus lo he corregido, intente hacerlo funcionar en un windows vista y modifique tanto el codigo (sin exito) para que funcionara que me lie un poco.

    Solo he podido hacerlo funcionar ejecutandolo sin depurar o desactivando la UAC (no aconsejable).

    El problema que veo en el drag & drop es que cuando arrastras la imagen, esta no se visualiza, tan solo cambia el cursor del raton como que la estas arrastrando, con lo que queda menos atractivo visualmente para hacerlo dentro de una aplicacion.

    Usando el primer ejemplo, puedes cambiar la transparencia mientras lo arrastras y hacer tareas mas personalizadas y aunque se puede hacer con los eventos 'DragDrop' de igual forma hay que recaer en el codigo del ejemplo.

    En cuanto a las imagenes, directamente subirlas al foro no, pero existe una galeria en el perfil del usuario en la que me parece que se pueden añadir y luego añadirlas al foro.


    Saludos David González
    Wednesday, May 06, 2009 4:25 PM
  • Hola David. En realidad cuando arrastras una imagen con drag-drop si que se ve como se va moviendo la imagen, lo que pasa que no consigo que lo haga de forma precisa. Asi que por ahora voy a utilizar el metodo que me enseñaste que va muy bien y ademas es sencillo. Gracias por tu ayuda, de verdad. Saludos
    Thursday, May 07, 2009 9:34 AM
  • Si, como lo estabas haciendo tu si que se ve, pero por que se usan las coordenadas del raton para mover la imagen.

    Yo me refiero cuando a un control le activas la propiedad 'AllowDrop' para permitirle aceptar datos arrastrando y no controlas el movimiento de la imagen, tan solo permites que se puedan arrastrar datos a un contenedor (en este caso imagenes a un pictureBox).

    En cualquier caso hay bastante abanico de posibilidades dependiendo de los efectos que se quiera producir.

    Gracias a ti, he aprendido cosas interesantes al intentar ayudarte (como por ejemplo que no funcione en vista el drag & drop en depuracion, algo que tengo que mirar cuando tenga un poco de tiempo).


    Saludos David González
    Thursday, May 07, 2009 10:55 AM

  • A vale, ya entiendo lo que me querias decir.

    Me alegra servirte "de ayuda" aunque sea de rebote,jasjasjsa. La verdad es que estoy super pegado en esto del Visual Studio y aprender solo en casa seria un infierno si no es por gente como tu a la que le gusta compartir sus conocimientos.

    Gracias
    Thursday, May 07, 2009 11:42 AM
  • Como ampliacion a este hilo, he puesto un fragmento de codigo en este otro para arrastrar imagenes creadas directamente sobre el GDI.

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/05f6bece-31a5-467d-bf52-8255aadaf74f


    Saludos David González
    Thursday, May 07, 2009 1:43 PM