logo
03

Взаимодействие с мышью

При обработке событий от мыши, отслеживайте нажатие и отпускание кнопок внутри контрола. Для этого в обработчике OnMouseDown установите свойство Capture в значение true, в обработчике OnMouseUp проверьте значение Capture. Если оно равно true, то нажатие и отпускание кнопки произошло в вашем контроле – установите Capture в значение false и обработайте нажатие. Если контрол состоит из разнородных частей, запоминайте, в каком именно месте произошло нажатие и отпускание, т.е. рассматривайте части контрола как независимые единицы взаимодействия.

При обработке OnMouseMove отслеживайте движение внутри и вне контрола. Если вы не захватили (captured) мышь, то движения мыши вне контрола вы не получите, в противном случае можно использовать ClientRectangle.Contains(new Point(e.X, e.Y)) для определения положения курсора.

Отслеживайте различные кнопки мыши согласно требованиям поведения контрола. Если вам нужна только левая кнопка, делайте соответствующие проверки, не игнорируйте значение MouseEventArgs.Button.

Если нужно различать нажатие или движение с клавишами-модификаторами, такими как Control, Shift, Alt, используйте статическое свойство ModifierKeys класса Control. Учтите, что пользователь может в любой момент поменять модификаторы, поэтому лучше отслеживать их в момент отпускания кнопки, когда действие уже завершено. Желательно также изменять курсор мыши, чтобы пользователь получал визуальное подтверждение изменения режима работы. Это можно сделать в OnKeyDown и OnKeyUp, обрабатывая соответственно Key.ShiftKey, Keys.ControlKey и Keys.Menu (кнопка Alt).