Лекция: Работа с клавиатурой

Поставим задачу сделать игру, где наш миниатюрный гоночный автомобиль будет под управлением клавиш клавиатуры нестись от старта до финиша. Для этого вам нужно познакомиться с событиями, связанными с клавиатурой. Их три: 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 “Зенитка”: Вверху справа налево медленно движется вражеский самолет. В подходящий момент вы нажатием любой клавиши запускаете снизу вверх зенитный снаряд. Здесь нужны два таймера.

 

еще рефераты
Еще работы по информатике