Получение местоположения кнопки в сетке от Mousehover (C # VS) - PullRequest
0 голосов
/ 21 февраля 2019

в школе в настоящее время я работаю над игрой линкоров для AP Comp Sci и пытаюсь сделать так, чтобы на этапе размещения корабля окно с изображением (корабль) меняло местоположение на то, с какой бы кнопкой ни происходила мышьбыть зависшимЭто должно действовать как призрачная иконка для того места, где вы бы разместили корабль.Кнопки находятся в массиве, так как они сделаны в виде сетки с использованием 2D-цикла.

Я не мог понять, как заставить MouseHover работать с получением расположения кнопок из массива кнопок.Это происходит главным образом потому, что я не знаю, как передать значения xy для расположения кнопок в массиве методу MouseHover.

Я попытался использовать таймер, который проверял каждую кнопку в массиве на предмет фокусировкии он успешно изменил расположение ящика с картинкой на эту кнопку:

private void MouseXYCheckTimer_Tick_1(object sender, EventArgs e)
    {
        for (int x = 0; x < 15; x++)
        {
            for (int y = 0; y < 15; y++)
            {
                if (b[x, y].Focused)
                {
                    ShipImage1.Location = b[x, y].Location;
                }
            }

        }
    }

, однако для этого потребовалось нажать кнопку, чтобы выделить его (таким образом, разместив корабль), победив цель.

Я довольно подробно рассмотрел различные посты здесь, на MouseHover, и до сих пор не могу заставить его работать для моей проблемы, помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

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

Если я правильно понимаю, и при условии, что вы используете Winforms, вам просто нужно подписать логику положения изображения на событие MouseMove каждой из ваших кнопок.Попробуйте следующее:

Определите этот метод в своем классе:

private void button_MouseMove(object sender, MouseEventArgs e)
{
    ShipImage1.Location = e.Location;
}

Затем в логике, отвечающей за создание экземпляра каждой кнопки, хранящейся в вашем массиве b, подпишитесь на этот методна событие MouseMove:

...
for (int x = 0; x < 15; x++)
{
    for (int y = 0; y < 15; y++)
    {
        var myButton = new Button();

        myButton.MouseMove += button_MouseMove;

        // More awesome stuff around myButton...

        b[x, y] = myButton;
    }
}
...

Также при необходимости вы можете получить текущие координаты экранной мыши из статического свойства Form.MousePosition.

Удачи!

РЕДАКТИРОВАТЬ Или использовать вместо этого MouseEnter событие, как указано @Jerry в другом ответе, которое должно работать лучше.

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

Есть встроенные события для обработки MouseEnter

// Wire up the MouseEnter event when creating your buttons
button.MouseEnter += button_MouseEnter;

// Method that gets called
private void button_MouseEnter(object sender, EventArgs e)
{
    var button = sender as Button;
    ShipImage1.Location = button.Location;
}

...