Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с клавиатурой






Поставим задачу сделать игру, где наш миниатюрный гоночный автомобиль будет под управлением клавиш клавиатуры нестись от старта до финиша. Для этого вам нужно познакомиться с событиями, связанными с клавиатурой. Их три: KeyDown (клавиша нажата), KeyUp (клавиша отпущена) и KeyPress. (по клавише щелкнули). Нас пока интересуют только первые два.

События KeyDown и KeyUp

Создайте проект из одной формы, без элементов управления. Зайдите в окно кода и выберите для объекта Form событие KeyDown. В появившуюся заготовку процедуры запишите сдедующий код:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

 

'Определяем, какая клавиша клавиатуры была нажата:

Select Case KeyCode

Case vbKeyUp: Debug.Print " Нажата стрелка вверх"

Case vbKeyDown: Debug.Print " Нажата стрелка вниз"

Case vbKeyLeft: Debug.Print " Нажата стрелка налево"

Case vbKeyRight: Debug.Print " Нажата стрелка направо"

Case vbKeyW: Debug.Print " Нажата клавиша W"

Case vbKey7: Debug.Print " Нажата клавиша 7"

Case vbKeySpace: Debug.Print " Нажата клавиша пробела"

Case vbKeyDelete: Debug.Print " Нажата клавиша Delete"

Case vbKeyF4: Debug.Print " Нажата клавиша F4"

Case vbKeyAdd: Debug.Print " Нажата клавиша +"

Case vbKeyEscape: Debug.Print " Нажата клавиша Esc"

End Select

 

'Определяем, какие из трех клавиш клавиатуры (Shift, Ctrl, Alt) при этом были в нажатом состоянии:

Select Case Shift

Case 0: Debug.Print " Не нажата ни одна клавиша Shift, Ctrl, Alt"

Case 1: Debug.Print " Нажата клавиша Shift"

Case 2: Debug.Print " Нажата клавиша Ctrl"

Case 3: Debug.Print " Нажаты клавиши Shift, Ctrl"

Case 4: Debug.Print " Нажата клавиша Alt"

Case 5: Debug.Print " Нажаты клавиши Shift, Alt"

Case 6: Debug.Print " Нажаты клавиши Ctrl, Alt"

Case 7: Debug.Print " Нажаты клавиши Shift, Ctrl, Alt"

End Select

End Sub

Два параметра в скобках заголовка процедуры - это две вещи, которые компьютер сообщает процедуре в момент события:

· KeyCode - код нажатой клавиши. На клавиатуре - сто с лишним клавиш. На каждой - по две буквы или один, два, три других символа. Компьютер различает клавиши независимо от того, какие значки на них нанесены. Так мать различает сыновей независимо от того, что написано у них на майках. У каждого сына есть имя, у каждой клавиши есть код (KeyCode). Итак, попросту говоря, компьютер сообщает процедуре, какая клавиша была нажата. Полный список кодов находится в Object Browser (класс KeyCodeConstants).

· Shift - были ли при этом в нажатом состоянии клавиши клавиатуры (Shift, Ctrl, Alt) и какие именно. В численном значении Shift та же система, что и в событии MouseDown. Совместное нажатие клавиш Shift, Ctrl, Alt " равно" сумме их нажатий по-одиночке (1, 2 и 4).

Запустите проект и проверьте, как работает программа. Обратите внимание, что при удержании клавиш в нажатом состоянии событие генерируется (создается компьютером) несколько раз в секунду. Положение несколько меняется, когда при нажатой Shift, Ctrl или Alt щелкается обычная клавиша. Впрочем, пока это неважно.

 

События, связанные с клавиатурой, имеются у многих объектов. Поместим на форму, к примеру, пару кнопок и текстовое поле. Предположим, процедуру Private Sub Form_KeyDown мы стерли, а написали три процедуры:

Private Sub Command1_KeyDown…

Private Sub Command2_KeyDown…

Private Sub Text1_KeyDown…

Запустим программу и щелкнем по какой-нибудь клавише. Какая из трех процедур сработает? Та, чей объект находится в фокусе. Для нашей игры это неудобно: если мы для программирования реакции автомобиля на нажатия клавиш выберем, например, процедуру Private Sub Command2_KeyDown, то во время гонки мы не сможем щелкать по другим кнопкам, кроме Command2, так как иначе Command2 выйдет из фокуса и автомобиль перестанет реагировать на клавиши. Не надо было стирать процедуру Private Sub Form_KeyDown, восстановим ее. Но это не помогает. По простой причине - один какой-нибудь объект на форме всегда находится в фокусе, так что до процедуры Private Sub Form_KeyDown дело никак не доходит. Против этого в Visual Basic есть специальный прием - свойство формы KeyPreview устанавливается в True. Это означает приказ компьютеру почти каждое нажатие на клавиши считать событием формы, а не другого объекта. Вдобавок к этому советую поместить в самый конец процедуры Private Sub Form_KeyDown оператор KeyCode=0. Тоже хорошо помогает (без комментариев).

Что значит " почти каждое нажатие"? Есть исключения - клавиши Enter, Esc, Tab в некоторых случаях.

 

Событие KeyUp работает аналогично.

 

Задание 112 “Светофор”: Нарисуйте светофор: прямоугольник и три круга. При нажатии на клавиатуре клавиши R светофор должен загораться красным светом, G - зеленым, Y - желтым. Здесь таймер не нужен.

Задание 113 “Зенитка”: Вверху справа налево медленно движется вражеский самолет. В подходящий момент вы нажатием любой клавиши запускаете снизу вверх зенитный снаряд. Здесь нужны два таймера.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал