Как и в случае с SimpleCoder, мне пришлось переопределить член IsInputKey
для класса Button.
public class ControlButton : Button
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Up)
{
return true;
}
else if (keyData == Keys.Down)
{
return true;
}
else if (keyData == Keys.Left)
{
return true;
}
else if (keyData == Keys.Right)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
}
Тогда мне нужно, чтобы создать экземпляр моих объектов кнопки (в классе дизайнера), используя этот новый класс, например, так:
private ControlButton btnDown;
private ControlButton btnRight;
private ControlButton btnLeft;
private ControlButton btnUp;
this.btnDown = new ControlButton();
this.btnRight = new ControlButton();
this.btnUp = new ControlButton();
this.btnLeft = new ControlButton();
Следующего Я зарегистрировал OnClick
обработчиков для каждого из новых объектов кнопки, как так :
this.btnUp.Click += new System.EventHandler(this.btnUp_Click);
private void btnUp_Click(object sender, EventArgs e)
{
MessageBox.Show("Up");
}
(и т.д.)
И зарегистрировал KeyDown
обработчик для главной формы:
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown);
private void frmUavController_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W))
{
btnUp.PerformClick();
}
else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S))
{
btnDown.PerformClick();
}
else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A))
{
btnLeft.PerformClick();
}
else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D))
{
btnRight.PerformClick();
}
}
Задав основную форму собственности KeyPreview
к истине, и, видя, как если бы я не был переопределен поведение по умолчанию вверх, вниз, влево и вправо клавиш, кнопки управления больше не но скорее верните true, передав управление обратно в основную форму. Отсюда, если нажаты последующие клавиши (вверх, вниз, влево или вправо), форма выполняет соответствующий обработчик.
Я думаю, он пытается предотвратить это поведение, хотя вопрос довольно расплывчатый. – 2010-11-23 06:49:28
Из того, что я понимаю, wulfgarpro хочет поймать KeyDown формы, когда кнопка находится в фокусе и нажаты кнопки со стрелками. – TarasB 2010-11-23 06:51:15
Да, я пытаюсь предотвратить это поведение. Извините, вопрос непонятен. Я не могу объяснить это более ясно. – wulfgarpro 2010-11-23 06:54:09