Move PictureBox using Arrow Keys - 处理 PictureBox 中的键盘事件
Move PictureBox using Arrow Keys - Handle keyboard events in PictureBox
我有一个 PictureBox
,我在其中使用下面的代码来移动我的对象。我需要在表单中添加一些按钮,但是当我启动程序时,箭头键在按钮之间导航,而不是我的输入按键。我试过很多
Form.Load()
上的 PictureBox.Focus()
和 PictureBox.Select()
之类的方式,并完全禁用此答案 here 上的箭头键导航,但我的对象将不再移动。
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;
}
}
如何在不影响我在 UpdateScreen()
中的代码的情况下禁用所有按钮的箭头键导航?
PictureBox
控件不是 Selectable
,因此它无法处理键盘事件。要解决这个问题,你应该首先使控件可选:
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);
}
}
然后就可以处理它的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;
}
}
我有一个 PictureBox
,我在其中使用下面的代码来移动我的对象。我需要在表单中添加一些按钮,但是当我启动程序时,箭头键在按钮之间导航,而不是我的输入按键。我试过很多
Form.Load()
上的 PictureBox.Focus()
和 PictureBox.Select()
之类的方式,并完全禁用此答案 here 上的箭头键导航,但我的对象将不再移动。
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;
}
}
如何在不影响我在 UpdateScreen()
中的代码的情况下禁用所有按钮的箭头键导航?
PictureBox
控件不是 Selectable
,因此它无法处理键盘事件。要解决这个问题,你应该首先使控件可选:
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);
}
}
然后就可以处理它的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;
}
}