Читайте также:
|
|
Создадим программу на определение точности руки и глаза: При нажатии кнопки возникает в случайном месте экрана и тут же исчезает маленькая окружность. Вы должны поточнее щелкнуть мышкой там, где она была. После щелчка компьютер сообщает вам, на каком расстоянии от центра окружности было острие мышиного курсора во время щелчка.
Для создания программы нам необходимо поближе познакомиться с событиями, возникающими при работе с мышью. Заглянем в "универсальный справочник" - Object Browser. Поскольку щелкать мышью мы будем над формой, то в левой части Object Browser выберем объект Form. В правой части отыщем события, связанные с мышью. Нас пока интересует пять событий: Click (щелчок), DblClick (двойной щелчок), MouseDown (нажали клавишу мыши), MouseUp (отпустили клавишу мыши), MouseMove (сдвинули мышь).
События Click и DblClick нам не подойдут, так как они ничего не говорят о координатах мыши во время щелчка. А вот MouseDown подойдет, так как координаты сообщает. А при щелчке события MouseDown и MouseUp обязательно наступают, так как любой щелчок это не что иное, как нажатие и отпускание.
События MouseDown и MouseUp
Зайдем в окно кода и выберем для объекта Form событие MouseDown (как это делать, я вас учил в 3.6). В окне кода появится следующая заготовка:
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
End Sub
4 параметра в скобках - это 4 вещи, которые компьютер сообщает процедуре в момент события:
· Button - какая из трех кнопок мыши была нажата
· Shift - были ли при этом в нажатом состоянии служебные клавиши на клавиатуре и какие именно
· X, Y - координаты острия курсора мыши во время нажатия
Для того, чтобы понять и проверить смысл этих параметров, прочтите (чтобы понять) и запустите (чтобы проверить) такую программу:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Определяем, какая клавиша мыши нажата:
Select Case Button
Case 1: Debug.Print "Нажата левая клавиша"
Case 2: Debug.Print "Нажата правая клавиша"
Case 4: Debug.Print "Нажата средняя клавиша"
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
'Определяем координаты острия курсора мыши во время нажатия:
Debug.Print "X="; X, "Y="; Y
End Sub
В численном значении Shift есть система. Посмотрите в процедуре, чему "равны" клавиши Shift, Ctrl, Alt по одиночке. 1, 2 и 4. Так вот, их совместное нажатие "равно" их сумме. Убедитесь.[†]
Поместите на форму несколько разных объектов. Обратите внимание, что при щелчке по ним процедура не срабатывает. Это естественно, у каждого объекта есть свое событие MouseDown.
Событие MouseUp работает аналогично.
Пример программы
Вот программа для поставленной выше задачи на точность руки и глаза:
Dim X_кружка As Integer
Dim Y_кружка As Integer
Dim Расстояние_до_кружка As Double
Private Sub Form_Load()
Randomize
End Sub
'Процедура для создания мелькнувшего кружка:
Private Sub Command1_Click()
X_кружка = 4000 * Rnd 'Определяем координаты кружка (центра кружка)
Y_кружка = 4000 * Rnd
ForeColor = vbBlack 'Чертим кружок черным цветом
Circle (X_кружка, Y_кружка), 50
For i = 1 To 3000000: Next 'Пауза, чтобы мы успели заметить кружок
ForeColor = BackColor 'Стираем кружок цветом фона
Circle (X_кружка, Y_кружка), 50
End Sub
'Процедура для определения расстояния от щелчка до кружка:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Расстояние_до_кружка = Sqr((X - X_кружка) ^ 2 + (Y - Y_кружка) ^ 2)
MsgBox ("Промах на " & Int(Расстояние_до_кружка) & " твип.")
End Sub
Пояснение того, как вычислялось расстояние (для тех, кто знает теорему Пифагора): Мысленно соедините отрезком прямой центр окружности и точку щелчка. Это будет гиппотенуза прямоугольного треугольника, катеты которого проведите вертикальной и горизонтальной линией. Нетрудно заметить, что горизонтальный катет равен X - X_кружка, а вертикальный равен Y - 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 "Не нажата ни одна клавиша мыши"
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 "Нажаты левая, правая, средняя клавиши"
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
'Определяем, координаты острия курсора мыши во время движения:
Debug.Print "X="; 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.
Дата добавления: 2015-11-16; просмотров: 55 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Private Sub Включить_сигнал_будильника() | | | Работа с клавиатурой |