使用鼠标移动多个面板

时间:2016-12-29 10:05:08

标签: c# winforms mouse panel

我有一个主面板,我创建了一些可以拖动的面板。移动。 (用户可以添加面板)

以下是我的公共类ObjetGrafcet的代码:Panel,

(UserControlGraf.SelectionActuelle是添加了用户选择面板的List)

public ObjetGrafcet()
    {
        Redimension = false;
        isClicked = false;
        onMove = false;
        this.DoubleBuffered = true;
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        foreach (Control ctr in UserControlGraf.SelectionActuelle)
        {
            if (onMove)
            {
                ctr.Left = ctr.Left - (ctr.Left % UserControlGraf.IntervalleGrilleX);
                ctr.Top = ctr.Top - (ctr.Top % UserControlGraf.IntervalleGrilleY);
            }
            if(ctr is Ligne)
            {
                ctr.Left += 1;
            }
        }
        Redimension = false;
        onMove = false;
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);

        if (e.Button == MouseButtons.Left && !UserControlGraf.SelectionActuelle.Contains(this))
        {
            isClicked = true;
            Cursor.Current = Cursors.Default;
            UserControlGraf.SelectionActuelle.Add(this);

            //Permet la selection d'un seul objet grafcet
            if (UserControlGraf.SelectionActuelle.Count == 2)
            {
                ((ObjetGrafcet)UserControlGraf.SelectionActuelle[0]).isClicked = false;
                ((ObjetGrafcet)UserControlGraf.SelectionActuelle[0]).Refresh();
                UserControlGraf.SelectionActuelle.RemoveAt(0);
            }
            if(this is TextFieldGraf)
            {
                if(e.X > this.Width-10 && e.Y > this.Height - 10)
                {
                    Redimension = true;
                }
            }

            this.Refresh();
        }
        DepartSouris = new Point(e.X, e.Y);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (this is TextFieldGraf)
            {
                if (e.X > this.Width - 10 && e.Y > this.Height - 10)
                {
                    Redimension = true;
                }
            }
            if (Redimension)
            {
                this.Width = e.X  - (e.X % UserControlGraf.IntervalleGrilleX);
                this.Height = e.Y  - (e.Y % UserControlGraf.IntervalleGrilleY);
            }
            else
            {
                foreach (Control ctr in UserControlGraf.SelectionActuelle)
                {
                    ctr.Left = e.X + ctr.Left - DepartSouris.X;
                    ctr.Top = e.Y + ctr.Top - DepartSouris.Y;
                }
                onMove = true;
            }
        }
        this.Refresh();
    }

问题在于,当我试图移动我的面板时,它的确很难。它不像我想要的那样流畅。我通过我的foreach是原因(可能因为它是一个缓慢的功能?)但我不知道如何以不同的方式做。

我的代码有什么问题?

以下是我获得的截图。我的行是继承自ObjetGrafcet的pobject。这是当我移动超过4/5行。 http://image.noelshack.com/fichiers/2016/52/1483006418-bugerror.png

0 个答案:

没有答案