Pregunta

Así que busqué un poco en Google para encontrar algún código para arrastrar botones con el mouse. Encontré mucho, a pesar de que ninguno de estos realmente funcionó para mí.

¡Así que te estoy preguntando! :-)

El código que estoy tratando de trabajar en mi forma:

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

Por supuesto, cambié el PictureBox1 a Button1.

Pero no puedo hacer que esto funcione.

¿Alguien que pueda saber por qué?

Ah, y quiero usar esto en todos mis botones, entonces, ¿con qué debo reemplazar Button1 para que funcione en todos los botones?

-Btw, uso Visual Studio Express.

¡Gracias de antemano!

¿Fue útil?

Solución

a pesar de que realmente solo estoy copiar pegado cuando se trata de formularios de Windows

¡El código que publicaste en realidad no hará nada por sí mismo!

Para trabajar, los eventos MouseDown () y MouseMove () del control deben conectarse a esos métodos:

  1. Seleccione el control en el formulario (PictureBox1).
  2. En el panel Propiedades (abajo a la derecha de forma predeterminada), haga clic en el icono "Lightning Bolt" para obtener una lista de los eventos para ese control.
  3. Encuentra el MouseDown ingresar y cambiar el menú desplegable a la derecha a pictureBox1_MouseDown.
  4. Encuentra el MouseMove ingresar y cambiar el menú desplegable a la derecha a pictureBox1_MouseMove.

Ahora ejecuta y arrastre el PictureBox1.

Editar: Aquí se muestra cómo hacer que el código funcione para múltiples controles, como se describe en mi comentario a continuación.

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }

Otros consejos

Ok, las buenas noticias: espero que tengamos un diseño de escritorio CSI una vez que haya terminado.

La no tan buena noticia: creo que estás tratando de hacer lo incorrecto.

Supongo que estás usando WinForms, pero la idea debería ser la misma para WPF. Cuando ejecuta su programa, el diseño está configurado (ya sea dinámicamente, por ejemplo, cambia cuando cambia el tamaño de la ventana, o estáticamente, por ejemplo, cuando lo establece con una posición X, Y absoluta).

Lo que quieres hacer es una especie de: quiero obtener los beneficios de que creen todo el código de la placa de la caldera, pero luego, quiero cambiarlo dinámicamente en el tiempo de ejecución ...

Creo que necesitas repensar tu enfoque y dar este paso a la vez (después de todo, Microsoft Tomó años para llevar la GUI a donde está en este momento ... Tomará algún tiempo obtener el futuro futuro Gui está fuera).

Tome pasos de bebé, pero tenga en cuenta el panorama general:

  • Comience con tener un lienzo definido.
  • Entonces puedes colocar un botón en él.
  • Luego se integre con mover ese botón en el lienzo. (El código que tiene en su pregunta debería funcionar para un objeto en un lienzo).

A partir de ahí, sigue tomando medidas que te acercarán a tu destino ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top