我正在用C#创建一个简单的学校游戏,我使用WASD键控制一个角色。该角色从精灵表中获取并放入图像列表中。图像列表位于图片框中。当输入表格时对焦picturebox
一切正常,当它只是在窗体中的图片框,但是当我添加一个按钮或其他东西,它就像失去了焦点。它没有回应。
我已经搜索无尽的页面解决方案,当窗体打开时将焦点设置在图片框上,但是我还没有找到任何可行的方法。
我真的很感谢一些帮助。
编辑:这是WinForms。
我正在用C#创建一个简单的学校游戏,我使用WASD键控制一个角色。该角色从精灵表中获取并放入图像列表中。图像列表位于图片框中。当输入表格时对焦picturebox
一切正常,当它只是在窗体中的图片框,但是当我添加一个按钮或其他东西,它就像失去了焦点。它没有回应。
我已经搜索无尽的页面解决方案,当窗体打开时将焦点设置在图片框上,但是我还没有找到任何可行的方法。
我真的很感谢一些帮助。
编辑:这是WinForms。
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;
}
这是WinForms? – ChrisF 2012-01-15 23:00:03
是的。我忘了写它。 – Antmoritz 2012-01-15 23:01:56