2012-01-15 3 views
1

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

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

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

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

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

+0

Это WinForms? – ChrisF

+0

Да, это так. Я забыл написать это. – Antmoritz

ответ

2

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

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

Лучшим подходом было бы переопределить метод FormCmdKey() формы. Этот метод называется целевым элементом управления, таким как ваша кнопка, чтобы решить, является ли ключ особенным. Если кнопка не распознает ее как специальную, она вызывает родительский элемент управления. Таким образом, для каждого нажатия клавиши будет вызываться метод уровня формы, который не является специальным ключом для фактической цели. Это позволяет 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

Но должен ли быть какой-то способ решить эту проблему? – Antmoritz

+0

Нет ли способа переопределить это? Как еще я должен перемещать своего персонажа? – Antmoritz

+2

Упоминание переопределения метода FormCmdKey() формы для ответа. –