简体   繁体   English

标签不使用鼠标事件移动

[英]Labels don't move using Mouse events

I created 5 labels using a for.我使用 for 创建了 5 个标签。 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:在 for 中,我声明了标签的属性,例如位置、大小、颜色等,以及使用鼠标事件移动标签的可能性:

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.我认为这可能是一个缩进问题,但我不确定。

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++)
  {

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)] .并将文件中的每个letras替换为labels[(number)]

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. letras_MouseMove方法接收到的sender参数Label ,因此首先要做的是转换为可用的Label object。 Then simply test the static Control.MouseButtons property to determine if the Left button is currently active.然后简单地测试 static Control.MouseButtons属性以确定左键当前是否处于活动状态。 You calculated the offset correctly.您正确计算了偏移量。 I believe that all you really needed was to have the correct Label object.我相信您真正需要的只是拥有正确的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 OnLoad(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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM