Фокус картинке при вводе формы - PullRequest
1 голос
/ 16 января 2012

Я создаю простую игру для школы на C #, где я управляю персонажем с помощью клавиш WASD. Персонаж взят из листа спрайта и помещен в список изображений. Список изображений находится в картинке.

Все отлично работает, когда в форме просто картинка, но когда я добавляю кнопку или что-то еще, это похоже на потерю фокуса. Это не отвечает.

Я искал на бесконечных страницах решение, чтобы сфокусироваться на картинке при открытии формы, но я не нашел ничего, что бы работало.

Я был бы очень признателен за помощь.

Редактировать: это WinForms.

Ответы [ 2 ]

2 голосов
/ 16 января 2012

PictureBox не может сфокусироваться. Он предназначен для показа изображения, но не предназначен для ввода данных пользователем, например с клавиатуры.

Грубым подходом было бы перехватить событие OnKeyDown в самой форме, а затем проверить интересующие ключи. Это будет работать до тех пор, пока элемент управления, имеющий фокус, например, кнопка, не хочет обрабатывать эти клавиши самостоятельно.

Лучшим подходом было бы переопределение метода ProcessCmdKey () формы. Этот метод вызывается на целевом элементе управления, например на кнопке, чтобы определить, является ли ключ особенным. Если Button не распознает его как особый, он вызывает родительский элемент управления. Таким образом, ваш метод уровня формы будет вызываться для каждого нажатия клавиши, которое не является специальной клавишей для фактической цели. Это позволяет кнопке по-прежнему обрабатывать клавишу ENTER, которая используется для нажатия кнопки, но другие клавиши будут обрабатываться вашей формой.

Наконец, чтобы перехватить все ключи до того, как они будут обработаны любым из элементов управления в форме, вам нужно будет реализовать интерфейс IMessageFilter. Как то так ...

public partial class MyWindow : Form, IMessageFilter
{
    public MyWindow()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        // WM_KEYDOWN
        if (m.Msg == 0x0100)
        {
            // Extract the keys being pressed
            Keys keys = ((Keys)((int)m.WParam.ToInt64()));

            // Test for the A key....
            if (keys == Keys.A)
            {
                return true; // Prevent message reaching destination
            }
        }
    }

    return false;
}
0 голосов
/ 25 сентября 2018

Я обнаружил, что событие MouseHover с pictureBox1_Hover вызывает функцию pictureBox1.Focus (). Когда мышь будет наведена на рассматриваемый PictureBox, она получит фокус. Кроме этого, не похоже, что вызов pictureBox1.Focus () во время загрузки формы оказал какое-либо влияние на фокус.

this.pictureBox1.MouseHover += new System.EventHandler(this.pictureBox1_Hover);
private void pictureBox1_Hover(object sender, EventArgs e)
        {
            pictureBox1.Focus();
        }

У меня это сработало!

...