0

几个小时以来,我一直在尝试做一些实际上看起来“简单”的事情,但我无法理解如何去做......并且潜伏在 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 中似乎不存在透明对象。

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

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

克里斯蒂亚诺

4

1 回答 1

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
于 2016-02-03T00:40:35.473 回答