Home > Mobile >  Labels don't move using Mouse events
Labels don't move using Mouse events

Time:07-30

I created 5 labels using a for. Inside the for I declared the properties of the labels, such as location, size, color, etc. and the possibility to move the labels using the mouse events:

private void Form1_Load(object sender, EventArgs e)
{
  int alto = 100;
  int ancho = 65;
           
  for (byte fila = 0; fila < 5; fila  )
  {
    Label letras = new Label();
    letras.Height = alto;
    letras.Width = ancho;
    letras.BackColor = Color.Blue;
    letras.ForeColor = Color.AntiqueWhite;
    letras.Font = new Font("Arial", 60);
    letras.TextAlign = ContentAlignment.MiddleCenter;
    letras.BorderStyle = BorderStyle.FixedSingle;
    letras.Left = 200   (ancho   20) * fila;
    letras.Top = 60;
    letras.Text = null;
    letras.MouseDown  = new MouseEventHandler(this.letras_MouseDown);
    letras.MouseMove  = new MouseEventHandler(this.letras_MouseMove);
    letras.MouseUp  = new MouseEventHandler(this.letras_MouseUp);

    this.Controls.Add(letras);  
  }
}

Later in the code, I create the events which will make the labels move.

private void letras_MouseDown(object sender, MouseEventArgs e)
{
  mousedown = true;
}

private void letras_MouseMove(object sender, MouseEventArgs e)
{
  if (mousedown)
  {
    letras.Location = new Point(letras.Location.X   e.Location.X, letras.Location.Y   e.Location.Y);
  }
}

private void letras_MouseUp(object sender, MouseEventArgs e)
{
  mousedown = false;
}

but it isn't working. Any ideas? I think that could be an Indentation problem, but I'm not sure.

CodePudding user response:

Haven't tested but replace:

private void Form1_Load(object sender, EventArgs e)
{
  int alto = 100;
  int ancho = 65;
           
  for (byte fila = 0; fila < 5; fila  )
  {
      letras = new Label();

With:

Label[] labels = Array.Empty<Label>();
private void Form1_Load(object sender, EventArgs e)
{
    int alto = 100;
    int ancho = 65;
    for (byte fila = 0; fila < 5; fila  )
    {
        labels[fila] = new Label();

And replace every letras in the file with labels[(number)].

CodePudding user response:

The sender argument received by the letras_MouseMove method is the Label so the first thing to do is perform a cast to a usable Label object. Then simply test the static Control.MouseButtons property to determine if the Left button is currently active. You calculated the offset correctly. I believe that all you really needed was to have the correct Label object. (Of course I tested it)


Some of the code you posted is not necessary and should be removed. This shows a minimal working example.

public partial class MainForm : Form
{
    public MainForm() => InitializeComponent();
    protected override void onl oad(EventArgs e)
    {
        base.OnLoad(e);

        // This code stays the same
        int alto = 100;
        int ancho = 65;

        for (byte fila = 0; fila < 5; fila  )
        {
            Label letras = new Label();
            letras.Height = alto;
            letras.Width = ancho;
            letras.BackColor = Color.Blue;
            letras.ForeColor = Color.AntiqueWhite;
            letras.Font = new Font("Arial", 60);
            letras.TextAlign = ContentAlignment.MiddleCenter;
            letras.BorderStyle = BorderStyle.FixedSingle;
            letras.Left = 200   (ancho   20) * fila;
            letras.Top = 60;
            letras.Text = null;
            letras.MouseMove  = new MouseEventHandler(this.letras_MouseMove);
            this.Controls.Add(letras);
        }
    }
    // This code is different
    private void letras_MouseMove(object sender, MouseEventArgs e)
    {
        Label letra = (Label)sender;
        if(MouseButtons == MouseButtons.Left)
        {
            // Here, your original calculation works OK once you have the correct Label object
            letra.Location = new Point(letra.Location.X   e.Location.X, letra.Location.Y   e.Location.Y);
        }
    }
}
  • Related