VB.NET TableLayout MouseEnter和leave事件

时间:2016-02-02 23:13:58

标签: vb.net tablelayout tablelayoutpanel transparent-control

我试图做一些看起来很简单的事情"简单"几个小时以来,但我无法理解如何做到这一点......潜伏在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并留给该对象..但是在VB中似乎没有trasparent对象。

希望我在解释中已经很清楚..这已经很晚了,而且我有点累了。

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

克里斯蒂

1 个答案:

答案 0 :(得分: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

它对我来说似乎没问题,所以我希望你也一样。

我有一个谷歌关于鼠标轮询率,默认情况下,在Windows中,它是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