powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OnKeyDown
3 сообщений из 3, страница 1 из 1
OnKeyDown
    #32408849
kpu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kpu
Гость
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown (e);
if(e.KeyCode==Keys.Q | e.KeyCode==Keys.Up)
{
button1.Top-=10;
}
if(e.KeyCode==Keys.A | e.KeyCode==Keys.Down)
{
button1.Top+=10;
}

}

Почему не отрабатывает для стрелок?

И что можно сделать, чтобы в каждом контроле не писать.

private void button1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
OnKeyDown(e);
}
...
Рейтинг: 0 / 0
OnKeyDown
    #32409655
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы в каждом контроле не писать обработчик события, можно сделать так – создаём свой метод myKeyDown, и цепляем его ко всем контролам на форме:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void myKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode==Keys.W || e.KeyCode == Keys.NumPad8) 
{
((Button)sender).Top -=  10 ;
}
if (e.KeyCode==Keys.S || e.KeyCode == Keys.NumPad2) 
 {
((Button)sender).Top +=  10 ;
 }
}


Например в методе загрузки формы

Код: plaintext
1.
2.
3.
4.
5.
6.
private void Form1_Load(object sender, System.EventArgs e)
{
foreach (Control c in this.Controls) 
{
c.KeyDown += new System.Windows.Forms.KeyEventHandler(this.myKeyDown);
}
}


Это работает, если все контролы на форме – кнопки, если есть ещё что-то, а нужно выбрать например, только кнопки, то нужно сделать дополнительную проверку:

Код: plaintext
1.
2.
3.
if (sender is Button)
{
((Button)sender).Top -=  10 ;
}


Клавиши со стрелками используются для переноса фокуса на форме, поэтому можно их заменить на стрелки на Numpad’e

Код: plaintext
e.KeyCode == Keys.NumPad8


или поковыряться дальше, как можно это обойти.

Цеплять хэндлер к событию можно и здесь и в методе Main(), Только его надо изменить так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
static void Main() 
{
	Form1 F = new Form1();
	foreach (Control c in F.Controls) 
{
c.KeyDown += new System.Windows.Forms.KeyEventHandler(F.myKeyDown);
}
	Application.Run(F);
}


Потому что никакого this ещё нет.
...
Рейтинг: 0 / 0
OnKeyDown
    #32410126
kpu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kpu
Гость
Большое спасибо :)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OnKeyDown
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]