0

我一直在寻找这个东西......它应该可以工作但它不是。一定有什么我不明白或我遗漏的东西。这是一个非常简单的问题,但我似乎无法解决它。

如图所示,我得到了 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 放置相同的代码,但它工作得很好。

我真的需要这段代码来解决我遇到的一个大的控制闪烁问题。

4

1 回答 1

0

感谢 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
于 2015-06-18T22:53:21.183 回答