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!!"),即使我渲染矩形并确保按我创建的顺序击中它们。

再次感谢各位。

c#矩形点注册表

假设我正确理解了您要做的事情,这将不会像这样工作。让我用一个例子来说明:

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现在没有发生。为什么?

  1. 您的事件可能未触发。我不知道它是否真的是这样,因为我不能在你的代码中看到它,但它很可能是因为事件的名称。
  2. 即使事件被触发,它也不会传递第一个if语句,因为显然它不再在Rect1中。

解决方案:

  1. 用以下代码使一个方法连接到两个事件:

    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
        }
    }
    
  2. 或者制作两个独立的事件:

    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
        }          
    }