0 / 0 / 0
Регистрация: 23.04.2012
Сообщений: 5

Как обработать нажатие кнопки на клавиатуре

23.04.2012, 15:29. Показов 2246. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Пытаюсь написать игру ханойские башни
Механика игры: над штырями бегает квадратик (объект класса Arrow, класс Arrow, класс Arrow в свою очередь унаследован от класса Control), текущее положение квадратика определяет текущий штырь.
По нажатию кнопок вправо/влево на клавиатуре квадратик должен "перепрыгивать" в другое положение. Он, как ни странно не перепрыгивает, иначе я не обратился бы к вам.
Помогите найти ошибку.
Вот код класса Arrow и связанный с ним код в форме
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Arrow:Control
    {
        int currentpos;
        Point [] pos = new Point [3];
        
        public Arrow()
        {
            Meth();
            this.Width = 7;
            this.Height = 7;
            this.BackColor = Color.Navy;
            this.Location = pos[2];
        }
        public void NextPos()
        {
            currentpos++;
            currentpos = currentpos % 3;
            this.Location = pos[currentpos];
        }
        public void PrevPos()
        {
            currentpos--;
            currentpos = currentpos % 3;
            this.Location = pos[currentpos];
        }
        public void Meth()
        {
            pos[0] = new Point(100, 50);
            pos[1] = new Point(300, 50);
            pos[2] = new Point(500, 50);
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class Form1 : Form
    {
        Arrow a = new Arrow();
private void Form1_Load(object sender, EventArgs e)
        {
            this.Controls.Add(a);
            a.Show();
        }
private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right)
            {
                a.NextPos();
            }
            if (e.KeyCode == Keys.Left)
            {
                a.PrevPos();
            }
        }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2012, 15:29
Ответы с готовыми решениями:

Как обработать событие ctrl + нажатие кнопки
Добрый день, перечитал все связаные темы тут, никак не могу реализовать. Как обработать событие ctrl + нажатие кнопки?

Panel - обработать нажатие кнопки мыши
Такая ситуация, есть panel1 и textBox1 как сделать так что бы при нажатии левой кнопки мыши именно на Panel1 в TextBox1 заносился текст....

Как заставить Check и Radio кнопки обрабатывать нажатие стрелок на клавиатуре
На диалоговом окне размещены несколько стандартных элементов: Edit, Check и Radio Button. Хотелось бы, чтоб при нажатии стрелок вверх и...

7
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.04.2012, 16:55
C#
1
2
currentpos++;
currentpos = currentpos % 3;
смущает эта запись. Получаем
currentpos++; // 0+1=1
currentpos = currentpos % 3 // 1 % 3 = 0;
Было 0 стало 0. Поэтому наверное и не скачет.
0
0 / 0 / 0
Регистрация: 23.04.2012
Сообщений: 5
23.04.2012, 17:21  [ТС]
1 % 3 = 1 вроде бы, это ж остаток от деления
Собственно, вопрос решен, тема закрыта, спасибо за помощь.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.04.2012, 17:28
XvaN, да, че-то не выспался, лоханулся Но нам-то про решение расскажите
0
0 / 0 / 0
Регистрация: 23.04.2012
Сообщений: 5
23.04.2012, 17:34  [ТС]
Выяснил, что на абсолютно пустой форме кнопки отзываются, при добавлении контрола - нет.
Скопировал код из Form1_KeyDown в созданный Arrow_KeyDown, и все заработало, то есть, как мне теперь кажется, при добавлении любого контрола "фокус" или что-то переходит с формы на него и обработчики формы становятся нерабочими
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.04.2012, 17:36
XvaN, не знаю как в шарпе, но в дельфи есть компонент ApplicationEvents, который обрабатывает все события, перехватывая их (то есть работают на любом компоненте любой формы), то есть туда забивается KeyPress грубо говоря, и в любом месте он перехватывает управление и делает, что в нем написано (то есть написав в него процедуру (метод), он будет выполнятся для любого компонента формы, как будто у всех них написан этот обработчик). Вы уверены, что в шарпе этого нет, чтобы не дублировать код?
0
0 / 0 / 0
Регистрация: 23.04.2012
Сообщений: 5
23.04.2012, 17:39  [ТС]
Psilon, думаю, что в шарпе такое где-то обязательно есть, но я пока не знаю, где, пока решил проблему, как сумел=)
Спасибо за хороший совет, постараюсь найти что-то похожее, чтобы не дублировать код.
0
62 / 62 / 15
Регистрация: 03.01.2012
Сообщений: 137
23.04.2012, 18:11
Попробуй в обработчике кнопок своего контрола вызвать событие у обработчиков формы
Form1_KeyDown(sender,null);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2012, 18:11
Помогаю со студенческими работами здесь

Как обработать событие 'Нажатие апплетовской кнопки' в сервлете ?
Пиплы подскажите не могу найти в доках. Как обработать событие 'Нажатие апплетовской кнопки' в сервлете ? Чтобы было больше понятно...

Как в ListView обработать нажатие кнопки и изменить здесь же значение в textView ?
У меня есть ListView, у него есть своя разметка на которой находится строчки на каждой из которых Button и textView. Как мне обработать...

Нажатие кнопки на виртуальной клавиатуре
Возникла проблема: необходимо отслеживать нажатие на клавиши на виртуальной клавивтуре, однако onKeyDown на виртуальную клавиатуру не...

Нажатие кнопки Button по нажатию клавиши на клавиатуре
Всем добрый вечер , такая проблема облазил кучу сайтов и нашел много разного кода, но не один не заработал. Помогите пожалуйста, скиньте...

Обработать нажатие кнопки
Здравствуйте. У меня автоматически создаются девять кнопок, вот так: Button But = new Button; private void CreateButton() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru