netlib.narod.ru | < Назад | Оглавление | Далее > |
Приложение Windows Forms получает сведения об активности мыши в виде событий. Класс Control определяет 9 событий мыши и 9 соответствующих защищенных методов. Все классы, порожденные от Control (включая Form), также наследуют эти 9 методов.
Хотя мы подробно обсудим элементы управления в главе 12, полезно было бы иметь какое-то представление о принципах взаимодействия мыши с элементами управления уже сейчас. Представьте себе форму или диалоговое окно с множеством кнопок, текстовых меток и полей. Эти элементы управления считаются дочерними объектами формы, а форма — их родительским объектом (предком). Мы уже встречались с такой нотацией в программе SysInfoPanel из главы 4, когда в свойство Parent элемента управления Panel заносился объект Form.
Любое событие мыши может быть получено только одним элементом управления. Элемент управления получает события мыши, только когда он активизирован (включен) и видим, т.е. его свойства Enabled и Visible равны true. Обычно события мыши получает только элемент управления, находящийся прямо под курсором мыши.
Если провести курсор над дочерним элементом управления, который активизирован и видим, то событие мыши получит именно этот дочерний объект, а не его родительский объект. Если дочерний элемент управления деактивизирован (отключен) или невидим, то событие мыши получает его родительский объект. При этом все происходит так, как если бы дочерний объект был прозрачным. Если несколько элементов расположены «стопкой» в одной и той же физической точке, то событие мыши достанется активизированному и видимому элементу управления, занимающему высшую позицию в Z-порядке (первому сверху в «стопке»), иначе говоря, тому, что будет виден сверху всех перекрывающихся элементов управления. С этим мы разберемся в главе 12.
Любой объект, являющийся потомком или экземпляром Form, получает события мыши, только когда курсор находится над клиентской областью формы. Объект Form не получает события мыши, если курсор находится над границей, заголовком, системным меню, управляющими кнопками окна или полосами прокрутки.
Однако, как я еще покажу, иногда элемент управления или форма получает события мыши, даже если курсор мыши не расположен над ним. Эта функция называется захват (capturing) мыши и помогает формам и элементам управления отслеживать движения мыши. Ниже я еще много буду говорить об этом.
Вот четыре основных события мыши:
События Control (выборочно)
Событие | Метод | Делегат | Аргумент |
MouseDown | OnMouseDown | MouseEventHandler | MouseEventArgs |
MouseUp | OnMouseUp | MouseEventHandler | MouseEventArgs |
MouseMove | OnMouseMove | MouseEventHandler | MouseEventArgs |
MouseWheel | OnMouseWheel | MouseEventHandler | MouseEventArgs |
Как можно догадаться по их именам, события MouseDown и MouseUp говорят о том, что кнопка мыши нажата или отпущена. MouseMove сигнализирует о движении мыши, a MouseWheel происходит при вращении колесика мыши.
Только эти четыре события связаны с объектами типа MouseEventArgs. У класса MouseEventArgs пять неизменяемых свойств:
Свойства MouseEventArgs
Тип | Свойство | Доступ | Описание |
int | X | Чтение | Позиция мыши по горизонтали |
int | Y | Чтение | Позиция мыши по вертикали |
MouseButtons | Button | Чтение | Кнопка (или кнопки) мыши |
int | Clicks | Чтение | В случае двойного щелчка возвращает 2 |
int | Delta | Чтение | Вращение колесика мыши |
X и Y — целочисленные значения, указывающие координаты горячей точки курсора, исчисляемые в пикселах относительно верхнего левого угла клиентской области. Эта пара свойств действительна для всех четырех событий мыши.
Свойство Button указывает кнопку или кнопки, участвующие в данном событии. Это свойство не действительно для событий MouseWheel. В свойство Button заносится одно из значений перечисления MouseButtons:
Перечисление MouseButtons
Член | Значение |
None | 0x00000000 |
Left | 0x00100000 |
Right | 0x00200000 |
Middle | 0x00400000 |
XButton1 | 0x00800000 |
XButton2 | 0x01000000 |
В этом перечислении Left следует понимать как главную кнопку, заданную пользователем, т.е. кнопку, которая вызывает меню приложений и позволяет изменять размеры форм и перемещать их. Свойство Right указывает кнопку, вызывающую контекстное меню. XButton1 и XButton2 — это кнопки мыши IntelliMouse Explorer, у которой пять кнопок.
Для событий MouseDown и MouseUp свойство Button указывает, какая именно кнопка нажата или отпущена.
Для события MouseMove свойство Button указывает кнопку или кнопки, нажатые в текущий момент. Заметьте, что значениями этих свойств являются битовые флаги, которые можно комбинировать. Скажем, если нажаты одновременно левая и правая кнопки мыши, то значение свойства Button равно 0x00300000. Для объекта MouseEventArgs с именем mea следующее выражение вернет true, если нажата только правая кнопка мыши, и никаких других:
(mea.Button == MouseButtons.Right)
А это выражение всегда будет равно true, если нажата правая кнопка мыши, невзирая на другие кнопки:
(mea.Button & MouseButtons.Right != 0)
Свойство Clicks действительно лишь для событий MouseDown и обычно равно 1. Значение свойства равно 2, если за одним событием MouseDown достаточно быстро следует другое такое же, чтобы эта пара событий была квалифицирована как двойной щелчок.
Свойство Delta действительно лишь для событий MouseWheel. Если повернуть колесико мыши на один щелчок вперед, свойство Delta в типичном случае станет равно 120, а если на один щелчок назад, то ему будет присвоено –120.
netlib.narod.ru | < Назад | Оглавление | Далее > |