VB.NET TableLayout 鼠标进入和离开事件

VB.NET TableLayout MouseEnter and leave event

几个小时以来,我一直在尝试做一些实际上看起来 "simple" 的事情,但我不明白该怎么做...并且潜伏在 SO 或不同的网站上,似乎并不那么明显.

问题很简单:我有一个多行的 tableLayoutPanel,每一行都包含一个面板,该面板包含其他几个控件。

我只想当鼠标进入一行时,行背景改变,当鼠标离开该行时,它又恢复到原来的颜色。

这些是简单的事件捕获器,其中 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 和 leave。但是在 VB 中似乎不存在透明对象。

希望我的解释清楚..现在已经很晚了,我有点累了。

提前致谢 希望有人能帮助我

克里斯蒂亚诺

此版本的鼠标离开事件会检查鼠标是否仍在 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,默认情况下,在 windows 中,它是 125hz,这看起来不错。但是,如果快速移动鼠标,鼠标进入和离开面板的速度会更快,windows 可以检测到它。因此,有时 .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