我正在C#中为学校创建一个简单的游戏,我使用WASD键控制一个角色。角色从精灵表中取出并放入图像列表中。图像列表位于图片框中。
当它只是表单中的图片框时,一切正常,但当我添加一个按钮或其他东西时,它就像失去焦点一样。它没有回应。
我已经搜索了无数页面,以便在表单打开时将焦点设置在图片框上,但我找不到任何有效的方法。
我真的很感激一些帮助。
编辑:这是WinForms。
答案 0 :(得分:2)
PictureBox无法获得焦点。它旨在作为一种显示图像的方式,但不是为了允许用户输入,例如通过键盘。
粗略的方法是拦截Form本身上的OnKeyDown事件,然后测试感兴趣的键。只要具有焦点的控件(例如Button)不希望自己处理这些键,这将起作用。
更好的方法是覆盖Form的ProcessCmdKey()方法。在目标控件(例如Button)上调用此方法,以确定密钥是否特殊。如果Button没有将其识别为特殊,则它会调用父控件。这样,每次按键时都会调用表单级别方法,而不是实际目标的特殊键。这允许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;
}
答案 1 :(得分:0)
我发现带有pictureBox1_Hover的事件MouseHover调用了pictureBox1.Focus()起作用。当鼠标悬停在有问题的PictureBox上时,它将获得焦点。除此之外,似乎在表单加载期间调用pictureBox1.Focus()不会对焦点产生任何影响。
this.pictureBox1.MouseHover += new System.EventHandler(this.pictureBox1_Hover);
private void pictureBox1_Hover(object sender, EventArgs e)
{
pictureBox1.Focus();
}
对我有用!