Новости Фотки Надписи на партах Под гармошку Обои для рабочего стола Downloads Компьютерные магазины Фуфло ЕЯС НКС ООП СЦОД Гостевая Я ВКонтакте |
Объектно-ориентированное программированиеУрок №3. Обработка нажатий клавиш.На этом уроке я расскажу, как определить, какая клавиша на клавиатуре была нажата пользователем. Как Вы уже знаете, код нажатой клавиши считывается функцией getch(). Упрощённая обработка нажатий может осуществляться, например, вот так: #include <conio.h> В принципе, эта форма нормально функционирует и для простеньких программ вполне подойдёт. Но если мы хотим в программу добавить обработку таких клавиш, как F1, F2, ..., Insert, Delete, ..., Up, Left, ..., а также обработку различных комбинаций с Ctrl, Alt и Shift, то нам надо слегка изменить конструкцию программы. Сейчас объясню почему: Дело в том, что при нажатии некоторых клавиш на клавиатуре - в "компьютер" посылается один символ, при нажатии других - два символа. Давайте напишем программу, которая поможет нам определить, сколько символов посылается, и какие это символы.Наверняка, подобную программу Вы уже писали. Если же нет, то рекомендую скопировать этот код и протестировать. #include <conio.h> #include <iostream.h> Итак, мы видим, что при нажатии на буквы, цифры, пробел, Enter (и некоторые другие клавиши) нам выводится одна строка с кодом символа и самим символом. А при нажатии на функциональные клавиши или на клавиши управления курсором - выводятся по две строки; причём в первой строке находится символ с кодом 0. Таким образом, вышеописанная конструкция обработки клавиш не подойдёт. Например, клавиша Up посылает два символа: 0 и 72. Символ с кодом 0 - пропускается, а символ с кодом 72 будет обработан. Но ведь символ 'H' тоже имеет код 72, и он тоже будет обработан в том же месте. Изменим конструцию так: #include <conio.h> Вот собственно и всё. Вложенный блок switch разрешает проблему двусмысленности. Теперь перейдём к другой половине нашей задачи. Ведь есть такие клавиши, которые вообще никаких символов не посылают и на kbhit() не реагируют. Это касается клавиш Shift, Ctrl, Alt, NumLock, CapsLock и ScrollLock. И всё же есть способ определить нажатость этих клавиш. По адресу 0040:0017 располагается слово (слово - двухбайтовый блок), у которого каждый бит отвечает за одну из клавиш. Мы можем объявить дальний указатель на число типа unsigned int и пусть он указывает на эту обасть памяти unsigned far * KEYBOARD= (unsigned far *) 0x00400017; И теперь с помощью операции сдвига и выделения правого бита мы можем определить чему равен бит, нулю или единице. cout << "5-ый бит равен " << (*KEYBOARD >> 5) & 1; Для тестирования можно написать, например, такую программу: #include <conio.h> #include <stdio.h> #include <dos.h> Теперь мы знаем: что бы определить нажата ли, скажем, клавиша Ctrl, надо проверить такое условие: if ((*KEYBOARD >> 2) & 1) { Кстати, вот чем интересна обработка клавиш Shift, Ctrl, Alt, NumLock, CapsLock и ScrollLock, так это тем, что они не посылают никаких символов в "компьютер". Они просто - либо нажаты, либо не нажаты. Чтобы это правильнее понять, давайте посмотрим настройки клавиатуры в Windows. Вкладка "Скорость", раздел "Повтор вводимого символа". Как Вы видите, можно настроить "Задержку перед началом повтора" и "Скорость повтора". Так вот, когда мы нажимаем, например, пробел, то в "компьютер" записывается символ пробела, затем после небольшой паузы записывается ещё один символ пробела, а потом после второго раза пробелы будут записываться уже быстрее, причём через равный промежуток времени. (Блин, чего это я говорю как с детьми, "компьютер" да "компьютер"... Будет умнее и точнее, если я буду говорить "буфер клавиатуры". Короче запомните: все символы, которые Вы набираете на клавиатуре записываются в буфер клавиатуры. В нём может храниться до 16 символов. Если там уже запиханы 16 символов - значит буфер переполнен, и никакой другой символ туда не добавится. Это значит буфер клавиатуры надо освободить. А освободить его можно используя функцию getch(), которая извлекает один символ из этого буфера. А функция kbhit() - проверяет, есть ли в буфере клавиатуры хотя бы один несчитанный символ.) Что я этим хотел сказать? Я хотел сказать, что иногда при создании игр требуется определить именно нажата клавиша, или нет. Например танчики: танк может двигаться, пока клавиша нажата, когда она отпущена - он не перемещается. Или, эмуляция азбуки Морзе: тут уже нужно учитывать длительность нажатия. Вот в этих случаях и удобно применять эти клавиши. А вообще, для красоты, неплохо бы было завести отдельный класс Keyboard, в нём объявить статические функции которые будут показывать состояние этих клавиш. #include <conio.h> #include <stdio.h> #include <dos.h> |
Дизайн: Красиков Виктор, kv630@mail.ru, ICQ - 319227
Местонахождение: Россия, респ. Бурятия, г. Улан-Удэ
Время на сервере: 15.07.25 13:39
Время в Улан-Удэ: 15.07.25 18:39
Время генерации страницы 0.0068780000000001 сек.