0

Я пытаюсь сделать что-то, что на самом деле выглядит «просто» с нескольких часов, но я не могу понять, как это сделать ... и скрываясь над SO или разными сайтами, кажется, что, возможно, не так очевидно.VB.NET TableLayout MouseEnter и оставить событие

Вопрос прост: у меня есть таблицаLayoutPanel с несколькими строками, каждая из которых содержит панель, содержащую несколько других элементов управления.

Я просто хочу, чтобы, когда мышь входит в строку, меняется фон строки, и когда мышь покидает эту строку, она возвращается к исходному цвету.

Эти простые трапперы событий, где pnlLayoutRow это имя панели, содержащие другие элементы управления:

Private Sub devRowMouseEnter(sender As System.Object, e As EventArgs) Handles pnlLayoutrow.MouseEnter 
    pnlLayoutrow.BackColor = Drawing.Color.FromArgb(&HFFFFEEAA) 
End Sub 

Private Sub devRowMouseLeave(sender As System.Object, e As EventArgs) Handles pnlLayoutrow.MouseLeave 
    pnlLayoutrow.BackColor = Drawing.Color.FromArgb(&HFFE7DEBD) 
End Sub 

Проблема заключается в том: MouseEnter правильно произвели каждый раз, когда я войти в строку, но MouseLeave обжигают как только мышь достигнет одного из элементов управления внутри панели .., это сводит меня с ума.

В другой среде я решил бы это сделать прозрачный объект по всей панели и захватить mouseEnter и оставить для этого объекта ... но похоже, что в VB trasparent объектов не существует.

Надеюсь, что в моем объяснении было ясно. Это довольно поздно ночью, и я немного устал.

спасибо заранее надежда кто-то может помочь мне

Кристиано

ответ

1

Этой версию чек событий отпусков мыши, что мышь все еще в пределах вашего TableLayoutPanel и если после этого он выходит без изменение цвета

Private Sub devRowMouseLeave(sender As System.Object, e As EventArgs) Handles pnlLayoutRow.MouseLeave 
    Dim p As Point = Me.PointToClient(MousePosition) 
    If p.Y > pnlLayoutRow.Top And p.Y < (pnlLayoutRow.Top + pnlLayoutRow.Height) And p.X > pnlLayoutRow.Left And p.X < (pnlLayoutRow.Left + pnlLayoutRow.Width) Then 
     Exit Sub 
    Else 
     pnlLayoutRow.BackColor = Drawing.Color.FromArgb(&HFFE7DEBD) 
    End If 
End Sub 

Кажется, что все в порядке, поэтому я надеюсь, что это то же самое для вас.

У меня был Google о частотах опроса мыши, и по умолчанию в окнах это 125hz, что может показаться ОК. Однако, если вы быстро перемещаете мышь, мышь снова войдет и покинет панель, чтобы окна могли ее обнаружить. Из-за этого иногда события .MouseEnter и .MouseLeave не срабатывают. Поэтому у меня есть альтернатива, которая, по крайней мере, обнаружит, когда мышь покинет панель. Добавьте таймер, который вы получили в вашей форме tmrPanelLeave

Private Sub devRowMouseEnter(sender As System.Object, e As EventArgs) Handles pnlLayoutRow.MouseEnter 
    pnlLayoutRow.BackColor = Drawing.Color.FromArgb(&HFFFFEEAA) 
    tmrPanelLeave.Start() 
End Sub 

Private Sub tmrPanelLeave_Tick(sender As Object, e As EventArgs) Handles tmrPanelLeave.Tick 
    Dim p As Point = Me.PointToClient(MousePosition) 
    If p.Y > pnlLayoutRow.Top And p.Y < (pnlLayoutRow.Top + pnlLayoutRow.Height) And p.X > pnlLayoutRow.Left And p.X < (pnlLayoutRow.Left + pnlLayoutRow.Width) Then 
     Exit Sub 
    Else 
     pnlLayoutRow.BackColor = Drawing.Color.FromArgb(&HFFE7DEBD) 
     tmrPanelLeave.Stop() 
    End If 
End Sub 
+0

действительно приятно, позвольте мне попробовать, и я дам вам знать, спасибо! –

+0

пробовал ... он acutally doe не работает нормально. Если при запуске мыши курсор находится на внутреннем элементе управления, и я быстро выхожу из мыши, поэтому он не проходит, хотя сама панель, но она перескакивает из внутреннего элемента управления непосредственно за пределы пользовательского элемента управления, событие mouseleave не уволен. –

+0

Это будет из-за информации, которую окна предоставляют программе. Вы можете переместить код в мышь. Переместить событие. Однако будьте осторожны, это может привести к замедлению движения мыши. Если у вас есть другой код в событии перемещения мыши, вам может потребоваться удалить строку «Exit Sub». –

 Смежные вопросы

  • Нет связанных вопросов^_^