c#矩形点注册表
本文关键字:注册表 | 更新日期: 2023-09-27 18:09:19
我这里有一些代码,没有注册为真的,我已经失去了几个小时。如果这只是一个愚蠢的错误,我道歉。
bool Bdrag;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
Point Floater = new Point(e.X, e.Y);
Rectangle Rect = new Rectangle(200, 200 ,40 , 40);
Rectangle Rect2 = new Rectangle(250, 250, 40, 40);
if(Rect.Contains(Floater))
{
if(e.Button == MouseButtons.Left)
{
Bdrag = true;
}
else
{
Bdrag = false;
}
Console.WriteLine("success 1");
if(Rect2.Contains(Floater) && Bdrag == true)
{
Console.WriteLine("success 2!!")
}
}
}
我无法到达writeline("success 2!!"),即使我渲染矩形并确保按我创建的顺序击中它们。
再次感谢各位。
假设我正确理解了您要做的事情,这将不会像这样工作。让我用一个例子来说明:
Your rectangles don't touch each other (according to your coordinates):
__________
| |
| 1 |
| |
|__________|
__________
| |
| 2 |
| |
|__________|
当您将鼠标移动到Rect1中时触发该事件。让我们浏览一下代码:
if(Rect.Contains(Floater))
绝对正确。
假设按下鼠标左键,Bdrag
设置为true
。Console.WriteLine("success 1");
触发if(Rect2.Contains(Floater) && Bdrag == true)
绝对是假的,因为Floater
将永远在Rect1内,因为它的位置只有当你的鼠标在Rect1内时才会设置。
当你移动你的鼠标向Rect2现在没有发生。为什么?
- 您的事件可能未触发。我不知道它是否真的是这样,因为我不能在你的代码中看到它,但它很可能是因为事件的名称。
- 即使事件被触发,它也不会传递第一个if语句,因为显然它不再在Rect1中。
解决方案:
用以下代码使一个方法连接到两个事件:
bool Bdrag; private void panel1_MouseMove(object sender, MouseEventArgs e) { Rectangle Rect = new Rectangle(200, 200 ,40 , 40); Rectangle Rect2 = new Rectangle(250, 250, 40, 40); if(Rect.Contains(new Point(e.X + Rect.Location.X, e.Y + Rect.Location.Y))) { if(e.Button == MouseButtons.Left) { Bdrag = true; } else { Bdrag = false; } } if(Rect2.Contains(new Point(e.X + Rect2.Location.X, e.Y + Rect2.Location.Y)) && Bdrag == true) { //is executed when Rect2 has been hit after Rect1 } }
或者制作两个独立的事件:
bool Bdrag; private void panel1_MouseMove(object sender, MouseEventArgs e) { Rectangle Rect = new Rectangle(200, 200 ,40 , 40); if(e.Button == MouseButtons.Left) { Bdrag = true; } else { Bdrag = false; } } private void panel2_MouseMove(object sender, MouseEventArgs e) { Rectangle Rect2 = new Rectangle(250, 250, 40, 40); if(Rect2.Contains(new Point(e.X + Rect2.Location.X, e.Y + Rect2.Location.Y)) && Bdrag == true) { //is executed when Rect2 has been hit after Rect1 } }