使用箭头键移动PictureBox - 处理PictureBox中的键盘事件

时间:2021-03-04 15:53:10

I have a PictureBox where I use the code below to move my object. I need to add a few buttons in the form, however when I start the program the arrow keys navigate through the buttons instead of my input keypresses. I've tried many ways like PictureBox.Focus() and PictureBox.Select() on Form.Load(), and disabling the arrow key navigation completely on this answer here, but my object will not move anymore.

我有一个PictureBox,我使用下面的代码来移动我的对象。我需要在表单中添加几个按钮,但是当我启动程序时,箭头键会导航按钮而不是我的输入按键。我在Form.Load()上尝试过很多像PictureBox.Focus()和PictureBox.Select()这样的方法,并且在这里完全禁用箭头键导航,但是我的对象不再移动了。

private void UpdateScreen(object sender, EventArgs e) {

    if (Input.KeyPressed(Keys.Right) && Settings.direction != Direction.Left) {
        Settings.direction = Direction.Right;
    }
    else if (Input.KeyPressed(Keys.Left) && Settings.direction != Direction.Right) {
        Settings.direction = Direction.Left;
    }  
    else if (Input.KeyPressed(Keys.Up) && Settings.direction != Direction.Down) {
        Settings.direction = Direction.Up;
    }
    else if (Input.KeyPressed(Keys.Down) && Settings.direction != Direction.Up) {
        Settings.direction = Direction.Down;
    }
}

How do I just disable the arrow key navigation for all my buttons without affecting my code in UpdateScreen()?

如何在不影响UpdateScreen()代码的情况下禁用所有按钮的箭头键导航?

1 个解决方案

#1


3  

PictureBox control is not Selectable and therefore it can not handle Keyboard events. To solve the problem, you should first make the control selectable:

PictureBox控件不可选,因此无法处理Keyboard事件。要解决此问题,您应首先使控件可选:

using System;
using System.Windows.Forms;
class SelectablePictureBox : PictureBox
{
    public SelectablePictureBox()
    {
        SetStyle(ControlStyles.Selectable, true);
        SetStyle(ControlStyles.UserMouse, true);
        TabStop = true;
    }

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        this.Invalidate();
    }
    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        this.Invalidate();
    }
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        if (this.Focused)
            ControlPaint.DrawFocusRectangle(pe.Graphics, ClientRectangle);
    }
}

Then you can handle PreviewKeyDown event of it:

然后你可以处理它的PreviewKeyDown事件:

private void selectablePictureBox1_PreviewKeyDown(object sender,
    PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Left)
    {
        e.IsInputKey = true;
        myPictureBox1.Left -= 10;
    }
    else if (e.KeyCode == Keys.Right)
    {
        e.IsInputKey = true;
        myPictureBox1.Left += 10;
    }
}

#1


3  

PictureBox control is not Selectable and therefore it can not handle Keyboard events. To solve the problem, you should first make the control selectable:

PictureBox控件不可选,因此无法处理Keyboard事件。要解决此问题,您应首先使控件可选:

using System;
using System.Windows.Forms;
class SelectablePictureBox : PictureBox
{
    public SelectablePictureBox()
    {
        SetStyle(ControlStyles.Selectable, true);
        SetStyle(ControlStyles.UserMouse, true);
        TabStop = true;
    }

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        this.Invalidate();
    }
    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        this.Invalidate();
    }
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        if (this.Focused)
            ControlPaint.DrawFocusRectangle(pe.Graphics, ClientRectangle);
    }
}

Then you can handle PreviewKeyDown event of it:

然后你可以处理它的PreviewKeyDown事件:

private void selectablePictureBox1_PreviewKeyDown(object sender,
    PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Left)
    {
        e.IsInputKey = true;
        myPictureBox1.Left -= 10;
    }
    else if (e.KeyCode == Keys.Right)
    {
        e.IsInputKey = true;
        myPictureBox1.Left += 10;
    }
}