Поделиться через


События мыши в Windows Forms

При обработке ввода мыши обычно требуется знать расположение указателя мыши и состояние кнопок мыши. В этом разделе содержатся сведения о том, как получить эти сведения из событий мыши и объяснить порядок, в котором события щелчка мыши создаются в элементах управления Windows Forms. Список и описание всех событий мыши см. в разделе Как работает ввод мыши в Windows Forms. Также см. Обзор обработчиков событий (Windows Forms) и Обзор событий (Windows Forms).

Сведения о мыши

MouseEventArgs отправляется обработчикам событий мыши, связанным с нажатием кнопки мыши и отслеживанием движений мыши. MouseEventArgs предоставляет сведения о текущем состоянии мыши, включая расположение указателя мыши в клиентских координатах, на которых нажимаются кнопки мыши, и о том, прокручивается ли колесико мыши. Несколько событий мыши, таких как те, которые просто уведомляют, когда указатель мыши вошел в или вышел за границы элемента управления, отправляют EventArgs обработчику событий без дополнительных сведений.

Если вы хотите знать текущее состояние кнопок мыши или расположение указателя мыши, и вы хотите избежать обработки события мыши, можно также использовать свойства MouseButtons и MousePosition класса Control. MouseButtons возвращает сведения о том, какие кнопки мыши в настоящее время нажимаются. MousePosition возвращает координаты экрана указателя мыши и эквивалентен значению, возвращаемого Position.

Преобразование между координатами экрана и клиента

Так как некоторые сведения о расположении мыши расположены в клиентских координатах, а некоторые — в координатах экрана, может потребоваться преобразовать точку из одной системы координат в другую. Это можно сделать с помощью PointToClient и PointToScreen методов, доступных в классе Control.

Стандартное поведение события щелчка

Если вы хотите обрабатывать события щелчка мыши в правильном порядке, необходимо знать порядок, в котором события щелчка создаются в элементах управления Windows Forms. Все элементы управления Windows Forms вызывают события щелчка в одном порядке при нажатии и освобождении кнопки мыши (независимо от кнопки мыши), за исключением того, где указано в следующем списке для отдельных элементов управления. В следующем списке показано порядок событий, вызванных одним щелчком мыши:

  1. событие MouseDown.

  2. событие Click.

  3. событие MouseClick.

  4. событие MouseUp.

Ниже приведен порядок событий, вызванных для двойного нажатия кнопки мыши:

  1. событие MouseDown.

  2. событие Click.

  3. событие MouseClick.

  4. событие MouseUp.

  5. событие MouseDown.

  6. событие DoubleClick. (Это может отличаться в зависимости от того, имеет ли элемент управления бит стиля StandardDoubleClick значение true. Дополнительные сведения о настройке ControlStyles бита см. в методе SetStyle.)

  7. событие MouseDoubleClick.

  8. событие MouseUp.

Пример кода, демонстрирующий порядок событий щелчка мыши, см. в разделе Практическое руководство. Обработка событий ввода пользователей в элементах управления Windows Forms.

Отдельные элементы управления

Следующие элементы управления не соответствуют стандартному поведению событий щелчка мыши:

  • Button

  • CheckBox

  • ComboBox

  • RadioButton

    Заметка

    Для элемента управления ComboBox поведение события, подробно описанное позже, происходит, если пользователь щелкает поле редактирования, кнопку или элемент в списке.

    • Щелкните левой кнопкой мыши: Click, MouseClick

    • Щелкните правой кнопкой мыши: события щелчка не возникают

    • Дважды щелкните левую кнопку мыши: Click, MouseClick; Click, MouseClick

    • Дважды щелкните правой кнопкой мыши: события от щелчка не возникают

  • элементы управления TextBox, RichTextBox, ListBox, MaskedTextBoxи CheckedListBox

    Заметка

    Поведение события, подробно описанное позже, происходит, когда пользователь щелкает в любом месте этих элементов управления.

    • Щелкните левой кнопкой мыши: Click, MouseClick

    • Щелкните правой кнопкой мыши: события щелчка не возникают

    • Дважды щелкните левую кнопку мыши: Click, MouseClick, DoubleClick, MouseDoubleClick

    • Двойной щелчок правой кнопкой мыши: события щелчка не возникают

  • элемент управления ListView

    Заметка

    Поведение события, описанное ниже, происходит только в том случае, если пользователь щелкает объекты в элементе управления ListView. События не создаются для щелчков в любом месте элемента управления. Помимо описанных далее событий существуют события BeforeLabelEdit и AfterLabelEdit, которые могут быть интересны для вас, если вы хотите участвовать в проверке с элементом управления ListView.

  • элемент управления TreeView

    Заметка

    Поведение события, подробно описанное позже, происходит только в том случае, если пользователь щелкает на сами элементы или справа от элементов в управлении TreeView. События не создаются для щелчков где-либо еще на элементе управления. В дополнение к описанным далее событиям, существуют события BeforeCheck, BeforeSelect, BeforeLabelEdit, AfterSelect, AfterCheckи AfterLabelEdit, которые могут вас заинтересовать, если вы хотите использовать проверку с элементом управления TreeView.

Поведение отображения элементов управления переключателями

Переключаемые элементы управления, такие как элементы, производные от класса ButtonBase, имеют следующее характерное поведение отрисовки в сочетании с событиями щелчка мыши:

  1. Пользователь нажимает кнопку мыши.

  2. Элемент управления выглядит нажатым.

  3. Вызывается событие MouseDown.

  4. Пользователь освобождает кнопку мыши.

  5. Элемент управления отображается в поднятом виде.

  6. Вызывается событие Click.

  7. Инициируется событие MouseClick.

  8. Инициируется событие MouseUp.

    Заметка

    Если пользователь перемещает указатель за пределы элемента управления переключателем, держа кнопку мыши нажатой (например, отвел мышь от элемента управления Button в нажатом состоянии), элемент управления переключателем будет отображаться в поднятом состоянии, и произойдет только событие MouseUp. События Click или MouseClick не будут возникать в этой ситуации.

См. также