检查控件是否在另一个控件之上
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;
}
}
}
我一直在尝试制作拖放游戏。我有 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;
}
}
}