【问题标题】:Focus picturebox when entering form输入表格时聚焦图片框
【发布时间】:2012-01-15 22:57:58
【问题描述】:

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

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

我已经在无尽的页面中搜索了一种解决方案,以便在表单打开时将焦点设置在图片框上,但我没有找到任何可行的方法。

非常感谢您的帮助。

编辑:这是 WinForms。

【问题讨论】:

  • 是的。我忘记写了。

标签: c# winforms picturebox


【解决方案1】:

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

一种粗略的方法是拦截 Form 本身的 OnKeyDown 事件,然后测试感兴趣的键。只要具有焦点的控件(例如您的 Button)不想自己处理这些键,这将起作用。

更好的方法是覆盖 Form 的 ProcessCmdKey() 方法。在目标控件上调用此方法,例如您的 Button,以确定键是否特殊。如果 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;
}

【讨论】:

  • 没有办法覆盖吗?我还应该如何移动我的角色?
  • 提及覆盖表单的 ProcessCmdKey() 方法以做出回答。
【解决方案2】:

我发现使用 pictureBox1_Hover 调用 pictureBox1.Focus() 的事件 MouseHover 有效。当鼠标悬停在有问题的 PictureBox 上时,它将获得焦点。除此之外,在表单加载期间调用 pictureBox1.Focus() 似乎对焦点没有任何影响。

this.pictureBox1.MouseHover += new System.EventHandler(this.pictureBox1_Hover);
private void pictureBox1_Hover(object sender, EventArgs e)
        {
            pictureBox1.Focus();
        }

它对我有用!

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多