ПОНЯТНО О Visual Basic NET (том 2)

         

Подробности событий мыши. Класс MouseEventArgs


Мы с вами бесчисленное количество раз писали процедуру

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

и ни разу не заглядывали внутрь скобок. А видим мы там два параметра процедуры: один с именем sender, другой – e. Первый имеет тип Object и обозначает объект, с которым случилось событие, в нашем случае – Button1. Второй имеет тип EventArgs. Это некий общий тип для второго параметра и на нем мы останавливаться не будем. Рассмотрим лучше заголовки процедур для событий MouseDown, MouseUp и MouseMove. Например:

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)  _

Handles MyBase.MouseDown

События эти похожи и параметры у всех трех одинаковые. Мы уже сейчас можем извлечь пользу из параметра e, являющегося объектом класса MouseEventArgs. Польза от него та, что он содержит информацию о событии, например, какая кнопка мыши была нажата и какие у мыши в этот момент были координаты. Информация эта находится в нескольких свойствах объекта MouseEventArgs. Приведу те, что нас интересуют:

Свойства

Смысл

Тип значения



X, Y

Координаты острия курсора мыши в момент события

Integer

Button

Какая именно из кнопок мыши была нажата

Перечисление MouseButtons со значениями: Left (левая), Right (правая), Middle (средняя), None (никакая) и пара значений для пятикнопочной мыши.

Clicks

Равняется 0 (если не было щелчка), 1 (если был одинарный щелчок) или 2 (если был двойной щелчок).

Integer

Кроме этого класс MouseEventArgs поддерживает работу с колесом мыши.

Для того, чтобы понять и проверить смысл этих свойств, прочтите (чтобы понять) и запустите (чтобы проверить) такую программу:

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)  _

Handles MyBase.MouseDown

        Debug.WriteLine(e.X & "   " & e.Y)              'Печатаем координаты события

        Debug.WriteLine(e.Button.ToString)            'Печатаем английское название кнопки


        If e.Button = MouseButtons.Left Then Debug.WriteLine("Нажата левая кнопка мыши")
        If e.Button = MouseButtons.Right Then Debug.WriteLine("Нажата правая кнопка мыши")
        If e.Button = MouseButtons.Middle Then Debug.WriteLine("Нажата средняя кнопка мыши")
End Sub
Private Sub Form1_MouseUp( ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        Debug.WriteLine(e.X & "   " & e.Y)                'Печатаем координаты события
        Debug.WriteLine(e.Button.ToString)            'Печатаем английское название кнопки
        If e.Button = MouseButtons.Left Then Debug.WriteLine("Отпущена левая кнопка мыши")
        If e.Button = MouseButtons.Right Then Debug.WriteLine("Отпущена правая кнопка мыши")
        If e.Button = MouseButtons.Middle Then Debug.WriteLine("Отпущена средняя кнопка мыши")
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)  _
Handles MyBase.MouseMove
        Debug.WriteLine(e.X & "   " & e.Y)              'Печатаем координаты события
        Debug.WriteLine(e.Button.ToString)            'Печатаем английское название кнопки
        If e.Button = MouseButtons.Left Then Debug.WriteLine("Удерживается нажатой левая кнопка мыши")
        If e.Button = MouseButtons.Right Then Debug.WriteLine("Удерживается нажатой правая кнопка мыши")
        If e.Button = MouseButtons.Middle Then Debug.WriteLine("Удерживается нажатой средняя кнопка мыши")
        If e.Button = MouseButtons.None Then Debug.WriteLine("Не нажата ни одна кнопка мыши")
End Sub
Пояснения: Здесь я использовал свойственный объектам метод ToString, который возвращает в виде вразумительной строки имя или значение объекта.
Пощелкайте в разных местах формы всеми тремя кнопками мыши. Повозите мышь над формой, удерживая нажатой ту или иную кнопку. В окне Output вы будете наблюдать последовательность сообщений примерно такого вида:
264   24
None
Не нажата ни одна кнопка мыши
264   24
Left
Нажата левая кнопка мыши
337   83
Left
Удерживается нажатой левая кнопка мыши
337   83
Left
Отпущена левая кнопка мыши
341   83
None
Не нажата ни одна кнопка мыши
Пояснения здесь излишни.
Итоги. В тонкости я, конечно, не вникал, но полученной информации о мыши вполне достаточно для решения реальных задач.

Содержание раздела