在具有鼠标位置的面板中获取面板
Getting a panel within a panel with mouse position
我一直在寻找这个东西...它应该可以工作但没有。必须有一些我不明白或我想念的东西。这是一个很简单的问题,但我似乎无法解决它。
如图所示,我得到了 Panel1 和 Panel2。
我想在 Panel1 MouseLeave 事件中捕捉鼠标在 Panel2 上的时间。我的代码是这样的:
Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
If sender.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then
For Each ctrl As Object In sender.controls
If ctrl.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then Exit Sub
Next
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub
Private Sub Panel2_MouseLeave(sender As Object, e As EventArgs) Handles Panel2.MouseLeave
If Not sender.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub
我成功进入了第一个 if,但是 For Each 中的第二个 if 永远不等于 true。所以我认为第二个面板可能有问题,所以我尝试为 Panel2 MouseLeave 放置相同的代码,但它工作得很好。
我真的需要这段代码来解决我遇到的一个大的控件闪烁问题。
感谢 Hans Passant 的提示。我只需要用正确的控件调用 PointToClient :
Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
If sender.ClientRectangle.Contains(Panel1.PointToClient(Control.MousePosition)) Then
For Each ctrl As Object In sender.controls
If ctrl.ClientRectangle.Contains(ctrl.PointToClient(Control.MousePosition)) Then Exit Sub
Next
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub
我一直在寻找这个东西...它应该可以工作但没有。必须有一些我不明白或我想念的东西。这是一个很简单的问题,但我似乎无法解决它。
如图所示,我得到了 Panel1 和 Panel2。
我想在 Panel1 MouseLeave 事件中捕捉鼠标在 Panel2 上的时间。我的代码是这样的:
Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
If sender.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then
For Each ctrl As Object In sender.controls
If ctrl.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then Exit Sub
Next
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub
Private Sub Panel2_MouseLeave(sender As Object, e As EventArgs) Handles Panel2.MouseLeave
If Not sender.ClientRectangle.Contains(PointToClient(Control.MousePosition)) Then
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub
我成功进入了第一个 if,但是 For Each 中的第二个 if 永远不等于 true。所以我认为第二个面板可能有问题,所以我尝试为 Panel2 MouseLeave 放置相同的代码,但它工作得很好。
我真的需要这段代码来解决我遇到的一个大的控件闪烁问题。
感谢 Hans Passant 的提示。我只需要用正确的控件调用 PointToClient :
Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
If sender.ClientRectangle.Contains(Panel1.PointToClient(Control.MousePosition)) Then
For Each ctrl As Object In sender.controls
If ctrl.ClientRectangle.Contains(ctrl.PointToClient(Control.MousePosition)) Then Exit Sub
Next
If Not IsNothing(sender.BackgroundImage) Then sender.BackgroundImage = Nothing
End If
End Sub