输入表格时关注图片框

时间:2012-01-15 22:57:58

标签: c# winforms picturebox

我正在C#中为学校创建一个简单的游戏,我使用WASD键控制一个角色。角色从精灵表中取出并放入图像列表中。图像列表位于图片框中。

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

我已经搜索了无数页面,以便在表单打开时将焦点设置在图片框上,但我找不到任何有效的方法。

我真的很感激一些帮助。

编辑:这是WinForms。

2 个答案:

答案 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();
        }

对我有用!