检查控件是否在另一个控件之上

Check if a control is on top of another

我一直在尝试制作拖放游戏。我有 4 个面板和 4 个标签。您必须将标签拖到正确面板的顶部。

问题是检查面板顶部是否有标签。用户可以自由拖动标签。

private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            button1.Left = e.X + button1.Left - MouseDownLocation.X;
            button1.Top = e.Y + button1.Top - MouseDownLocation.Y;
        }
    }

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            MouseDownLocation = e.Location;
        }
    }

这是我用来移动控件的代码。不得不说这是一个测试项目,所以我用了按钮而不是标签,但是思路是一样的。

有什么方法可以检查控件是否在另一个控件之上?

判断鼠标是否在控件上,可以判断Cursor.Position是否在控件的ClientRectangle中,但是首先需要调用PointToClient的方法控件转换光标位置相对于面板的(0,0),例如:

var b = panel1.ClientRectangle.Contains(panel1.PointToClient(Cursor.Position));

可以在用于移动控件的同一事件处理程序中检查标志,例如:

if(b) panel1.BackColor = Color.Red; else panel1.BackColor = Color.Gray;

每次移动后,只需从 Bounds property of your button and panel, then use either Intersect() or Contains():

中获取矩形
    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            button1.Location = new Point(e.X + button1.Left - MouseDownLocation.X, e.Y + button1.Top - MouseDownLocation.Y);
            Rectangle btnRC = button1.Bounds;
            Rectangle pnlRC = panel1.Bounds;

            // see if the rectangles INTERSECT
            if (pnlRC.IntersectsWith(btnRC))
            {
                panel1.BackColor = Color.Green;
            }
            else
            {
                panel1.BackColor = this.BackColor;
            }

            // see if the panel COMPLETELY CONTAINS the button
            if (pnlRC.Contains(btnRC))
            {
                panel1.BackColor = Color.Green;
            }
            else
            {
                panel1.BackColor = this.BackColor;
            }
        }
    }