我试图做一些看起来很简单的事情"简单"几个小时以来,但我无法理解如何做到这一点......潜伏在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对象。
希望我在解释中已经很清楚..这已经很晚了,而且我有点累了。
提前谢谢你 希望有人能帮助我
克里斯蒂
答案 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