Шрифт:
Закладка:
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
'Определяем координаты острия курсора мыши во время нажатия:
Debug.Print "Х="; X, "Y="; Y
End Sub
В численном значении Shift есть система. Посмотрите в процедуре, чему "равны" клавиши Shift, Ctrl, Alt по одиночке. 1, 2 и 4. Так вот, их совместное нажатие "равно" их сумме. Убедитесь.[27]
Поместите на форму несколько разных объектов. Обратите внимание, что при щелчке по ним процедура не срабатывает. Это естественно, у каждого объекта есть свое событие MouseDown.
Событие MouseUp работает аналогично.
Пример программы:
Вот программа для поставленной выше задачи на точность руки и глаза:
Dim Х_кружка As Integer
Dim Y_Kpy>KKa As Integer
Dim Расстояние_до_кружка As Double
Private Sub Form_Load()
Randomize
End Sub
'Процедура для создания мелькнувшего кружка:
Private Sub Command1_Click()
Х_кружка = 4000 * Rnd 'Определяем координаты кружка (центра кружка)
Y_кружка = 4000 * Rnd
ForeColor = vbBlack 'Чертим кружок черным цветом
Circle (Х_кружка, Y_кружка), 50
For i = 1 То 3000000: Next 'Пауза, чтобы мы успели заметить кружок
ForeColor = BackColor 'Стираем кружок цветом фона
Circle (Х_кружка, Y_Kpy>KKa), 50
End Sub
'Процедура для определения расстояния от щелчка до кружка:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Расстояние_до_кружка = Sqr ((X — Х_кружка) A 2 + (Y — Y_кружка)^2)
MsgBox ("Промах на " & Int(Расстояние_до_кружка) & " твип.")
End Sub
Пояснение того, как вычислялось расстояние (для тех, кто знает теорему Пифагора): Мысленно соедините отрезком прямой центр окружности и точку щелчка.
Это будет гипотенуза прямоугольного треугольника, катеты которого проведите вертикальной и горизонтальной линией. Нетрудно заметить, что горизонтальный катет равен X — Х_кружка, а вертикальный равен Y — У_кружка (знак я не учитываю). Гипотенуза же равна нужному нам расстоянию. Теорема Пифагора гласит, что квадрат гипотенузы равен сумме квадратов катетов. Отсюда, гипотенуза равна корню квадратному из суммы квадратов катетов (каковая формула и записана в программе).
Событие MouseMove
Это событие возникает, как только мы сдвигаем мышку с места, а во время движения мыши оно возникает постоянно и многократно. Оно похоже на событие MouseDown, но есть и отличия. Запустите и проверьте эту поясняющую программу:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Определяем, какие клавиши мыши удерживаются нажатыми во время движения:
Select Case Button
Case 0: Debug.Print "He нажата ни одна клавиша мыши"
Case 1: Debug.Print "Нажата левая клавиша"
Case 2: Debug.Print "Нажата правая клавиша"
Case 3: Debug.Print "Нажаты левая, правая клавиши"
Case 4: Debug.Print "Нажата средняя клавиша"
Case 5: Debug.Print "Нажаты левая, средняя клавиши"
Case 6: Debug.Print "Нажаты правая, средняя клавиши"
Case 7: Debug.Print "Нажаты левая, правая, средняя клавиши"
'Определяем, какие из трех клавиш клавиатуры (Shift, Ctrl, Alt) удерживаются нажатыми во время движения:
Select Case Shift
Case 0: Debug.Print "He нажата ни одна клавиша 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
'Определяем, координаты острия курсора мыши во время движения:
Debug.Print "Х="; X, "Y="; Y
End Sub
Если событие MouseDown сообщает о нажатии какой-то одной клавиши мыши, то MouseMove сообщает о любой комбинации мышиных клавиш. Если событие MouseDown сообщает о событии нажатия какой-то клавиши, то MouseMove сообщает о состоянии мышиных клавиш (удерживаются нажатыми или нет).
Мышь рисует
Вот программа, превращающая мышку в карандаш:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
PSet (X, Y)
End Sub
Запустите ее и медленно ведите мышкой по форме. За мышкой остается нарисованный след.
Задание 110: Сделайте так, чтобы мышь рисовала только при нажатой левой клавише, что более привычно для всех, кто работал в графических редакторах.
Задание 111: Сделайте так, чтобы при щелчке по правой клавише толщина линии возрастала на 1.
Работа с клавиатурой
Поставим задачу сделать игру, где наш миниатюрный гоночный автомобиль будет под управлением клавиш клавиатуры нестись от старта до финиша. Для этого вам нужно познакомиться с событиями, связанными с клавиатурой. Их три: 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 "He нажата ни одна клавиша 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 76 Debug.Print "Нажаты клавиши Shift, Ctrl,