2016-05-03 2 views
0

У меня есть проблема с событием колеса мыши. Я пытался найти какие-либо ссылки на него, но всегда находил ответы на разные темы по этому вопросу. Я сделал событие мыши-колеса для всей формы (которая также полноэкранная, но она должна работать независимо от того, где находится мышь) - MouseWheel+=ChangeLength; (или MouseWheel += new MouseEventHandler(ChangeLength);, это не имеет значения) и положить точку останова в первой строке это, просто чтобы посмотреть, работает ли это.C# winforms- MouseWheel событие не срабатывает из-за свойств управления

Это не так.

Я открыл пустой проект, чтобы проверить его, и это удивительно! Затем я искал источник проблемы и выяснил, что только две строки в дизайнере делают разницу между успешным запуском события и вовсе не стрельбой. Две линий were-

this.rater.TabIndex = 15; 
this.rater.Visible = false; 

Если какие-либо из этих линий были раскомментированы, ничего не происходило при прокрутке колесика мыши, но если оба были удалены или комментарии, он работал нормально. Использование Focus(), нажатие на экране, изменение свойств за пределами дизайнера и других известных методов не помогло.

Мне нужно добавить, что rater является не просто регулярным контролем, и это, вероятно, является источником этой странной проблемы. Это настраиваемый элемент управления под названием ShapeRater. Я действительно не понимаю, почему и почему свойства Visible и TabIndex вызывают это, они совершенно не связаны! Кроме того, я удалил одного из оценщиков (что вызвало проблему), потому что другой был в порядке, но после его удаления предыдущий ОК начал инициировать это.

Есть ли у кого-нибудь идеи, почему это происходит и как это исправить?


Спасибо в продвижении и извините, если я не писал достаточно точно. Это мой первый вопрос на этом сайте.

ответ

0

Возможно, если вы сделаете его невидимым, вы нажимаете фокус на какой-то другой элемент управления (потому что ваш контроль теряет фокус и фокус идет куда-то еще, когда элемент управления исчезает). Конкретный элемент управления, который получает фокус, будет также зависеть от значений индекса табуляции, поскольку он будет чем-то вроде следующего или предыдущего элемента управления, к которому он обращается.

Обратите внимание, что с помощью специального элемента управления фокус автоматически не набирается щелчками мыши. Например, вам нужно будет позвонить Focus() в ваше событие MouseDown.

Кроме того, для того, чтобы сделать управление, мы получим мышиные события, просто нажимая на него курсор, вам необходимо сфокусироваться на MouseEnter. Что-то вроде MouseEnter += (s, e) => Focus();. Я не уверен, что это идеальное решение, так как я думаю, что вы будете «воровать» фокус с какого-то другого элемента управления, просто наведя на него мышь.

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

Ex:

HandleCreated += (s, e) => { 
    var maybeForm = FindForm(); 
    if (maybeForm == null) 
     return; // or throw since you should have a form by now 
    var form = maybeForm; 

    MouseEventHandler mouseScrollDelegate = (s, e) => MouseScroll(e.Delta); 
    foreach (var control in form.Controls.Cast<Control>()) 
     control.MouseWheel += mouseScrollDelegate; 
}; 

... 

void MouseScroll(int pDelta) { 
    var screenMouse = Cursor.Position; 
    var clientMouse = PointToClient(screenMouse); 
    if (!ClientRectangle.Contains(clientMouse)) 
     return; 

    // do something 
} 
Смежные вопросы