简体   繁体   English

C#拖放标签

[英]C# Drag & Drop labels

i have a problem with drag&drop. 我有拖放问题。 I have code: 我有代码:

      void labelWorker_MouseEvent(object sender, MouseEventArgs e)
    {
        Label labelWorker = (Label)sender;
        labelWorker.DoDragDrop(labelWorker, DragDropEffects.Move);
        labelWorker.MouseDown += new MouseEventHandler(labelWorker_MouseDown);
        labelWorker.MouseMove += new MouseEventHandler(labelWorker_MouseMove);
        labelWorker.MouseUp += new MouseEventHandler(labelWorker_MouseUp);
    }

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

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

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

    void labelWorker_MouseUp(object sender, MouseEventArgs e)
    {
        Label labelWorker = (Label)sender;
        isDragged = false;            
    }

Label starts freaking out when I try to move it. 当我尝试移动标签时,标签开始变得奇怪。 I think the problem is in 我认为问题出在

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

Ok. 好。 I just made it :) 我刚刚做到了:)

    bool clicked = false;
    int iOldX;
    int iOldY;
    int iClickX;
    int iClickY;
    void labelWorker_MouseDown(object sender, MouseEventArgs e)
    {
        Label labelWorker = (Label)sender;
        if (e.Button == MouseButtons.Left)
        {
            Point p = ConvertFromChildToForm(e.X, e.Y, labelWorker);
            iOldX = p.X;
            iOldY = p.Y;
            iClickX = e.X;
            iClickY = e.Y;
            clicked = true;
        }
    }

    void labelWorker_MouseMove(object sender, MouseEventArgs e)
    {
        Label labelWorker = (Label)sender;
        if (clicked)
        {
            Point p = new Point(); // New Coordinate
            p.X = e.X + labelWorker.Left;
            p.Y = e.Y + labelWorker.Top;
            labelWorker.Left = p.X - iClickX;
            labelWorker.Top = p.Y - iClickY;
        }
    }

    void labelWorker_MouseUp(object sender, MouseEventArgs e)
    {
        clicked = false;
    }

    private Point ConvertFromChildToForm(int x, int y, Control control)
    {
        Point p = new Point(x, y);
        control.Location = p;
        return p;
    }

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

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