- •Краткий путеводитель
- •Проектируйте
- •Сохраняйте гибкость
- •Коллекции элементов
- •Отрисовка
- •Придерживайтесь стандартов
- •Оптимизируйте
- •Взаимодействие с мышью
- •Взаимодействие с клавиатурой
- •Поведение в режиме дизайна
- •Использование атрибутов
- •Коллекции
- •Конверторы типов
- •Расширение компонентов
- •Локализация
- •Источники данных
- •Доступность
- •Конвертор типа
Взаимодействие с мышью
При обработке событий от мыши, отслеживайте нажатие и отпускание кнопок внутри контрола. Для этого в обработчике 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).
Взаимодействие с клавиатурой
Обычно контрол получает события от клавиатуры только в том случае, если он находится в фокусе. В простом контроле достаточно переопределить OnKeyDown и/или OnKeyPress, чтобы получить информацию о нажатых кнопках. Однако контейнеры (например, форма) могут перехватывать обработку нажатий клавиш раньше, чем они дойдут до текущего контрола.
При необходимости различать нажатие клавиш с клавишами-модификаторами, такими как Control, Shift, Alt, используйте свойство Modifiers полученного в обработчике объекта KeyEventArgs или отдельные свойства Control, Shift и Alt. Используйте свойство KeyCode этого объекта, если вы хотите получить код нажатой клавиши отдельно, и свойство KeyData, если вам нужно значение, комбинированное с управляющими клавишами. Также имеется свойство KeyValue, которое является целым числом, представляющим KeyData.
Для получения управляющих клавиш, вроде Tab, Return, Escape и стрелочек, которые обычно обрабатываются формой или другим контейнером, необходимо перегрузить метод IsInputKey и вернуть для нужных клавиш значение true. В противном случае такие кнопки будут обработаны контейнером согласно собственным правилам и не достигнут вашего контрола. В некоторых случаях может понадобиться перегрузить ProcessCmdKey или ProcessDialogKey.
Поддержка дизайнера форм и редактора
Хороший контрол должен быть удобен не только во время выполнения, но и при использовании его в дизайнере форм. Подробный рассказ о собственном дизайнере или редакторе выходит за рамки данной статьи, однако многие вещи довольно просты и могут резко повысить удобство использования вашего контрола во время дизайна.
