Я написал собственный элемент управления, основанный на другом коде, который включает в себя вызов SetStyle(ControlStyles.Selectable, false);
Это предотвращает вызов следующего кода (который работает, если я уберу вышеуказанную строку и сначала нажму на элемент управления, чтобы «сфокусировать» его):
protected override void OnMouseWheel(MouseEventArgs e)
{
ScrollBar.Value = Math.Min(ScrollBar.Value - e.Delta, ScrollBar.Maximum - ScrollBar.LargeChange);
LayoutChanged();
}
Мой элемент управления не нуждается в фокусировке, поэтому Selectable=false
является правильным.
Что мне нужно сделать, чтобы я мог запускать этот код всякий раз, когда мышь находится над моим контролем, а колесико мыши перемещается независимо от того, где находится фокус?
Спасибо за комментарии. Дополнительная информация: -
Я использую Windows 7, но любое решение должно работать на любой ОС.
Элемент управления наследуется через Control / ControlBase / BaseControl / BaseStyleControl, где последние 3 являются элементами управления DevExpress.
- Реальный фокус не следует менять только потому, что курсор находится над моим элементом управления
- Нет дочерних элементов управления, кроме полосы прокрутки (унаследованной DevExpress), которая обычно невидима и показывает себя, когда указатель мыши находится над тем местом, где он был бы при отображении.
- Элемент управления не делает ничего, кроме рисования самого себя (представьте себе несколько книжных полок, расположенных один под другим, с нарисованными на них обложками книг - количество полок увеличивается, чтобы вместить все книги, а полоса прокрутки позволяет прокручивать все в поле зрения.
Поскольку этот элемент управления используется везде, получение событий MouseWheel от Parent, который знает о своих требованиях, не является хорошей идеей.
Может быть, есть способ регистрации на первый взгляд (это MessagePreview?), Чтобы зажимать события MouseWheel до того, как произойдет нормальная обработка.