2012-01-15 115 views
1

我正在用C#创建一个简单的学校游戏,我使用WASD键控制一个角色。该角色从精灵表中获取并放入图像列表中。图像列表位于图片框中。当输入表格时对焦picturebox

一切正常,当它只是在窗体中的图片框,但是当我添加一个按钮或其他东西,它就像失去了焦点。它没有回应。

我已经搜索无尽的页面解决方案,当窗体打开时将焦点设置在图片框上,但是我还没有找到任何可行的方法。

我真的很感谢一些帮助。

编辑:这是WinForms。

+0

这是WinForms? – ChrisF 2012-01-15 23:00:03

+0

是的。我忘了写它。 – Antmoritz 2012-01-15 23:01:56

回答

2

PictureBox无法获得焦点。它的目的是作为一种显示图像的方式,但不打算允许用户输入,例如通过键盘。

一种粗糙的方法是在窗体本身上截获OnKeyDown事件,然后测试感兴趣的键。只要拥有焦点的控件(例如Button)不想自己处理这些密钥,就会工作。

更好的方法是覆盖Form的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

但是必须有一些方法来解决这个问题? – Antmoritz 2012-01-15 23:00:45

+0

是否有任何方法可以覆盖它?我还应该如何移动我的角色? – Antmoritz 2012-01-15 23:03:22

+2

提到覆盖表单的ProcessCmdKey()方法来作出答案。 – 2012-01-15 23:08:15

相关问题