Проверьте, находится ли элемент управления над другим - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался сделать игру перетаскиванием.У меня 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;
        }
    }

Вот код, который я использовал для перемещения элемента управления.Я должен упомянуть, что это тестовый проект, поэтому я использовал кнопку вместо метки, но идея та же.

Есть ли способ проверить, находится ли элемент управления над другимили нет ?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

После каждого хода просто получите прямоугольник из свойства Bounds вашей кнопки и панели, затем используйте Intersect () или 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;
            }
        }
    }
0 голосов
/ 15 февраля 2019

Чтобы проверить, находится ли мышь над элементом управления, вы можете проверить, находится ли 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;
...