Получение панели внутри панели с позицией мыши
Я искал эту вещь... Она должна работать, но это не так. Должно быть что-то, чего я не понимаю или чего мне не хватает. Это довольно простая проблема, но я не могу ее решить.
Я получил Panel1 и Panel2, как показано на этом рисунке.
Я хочу поймать, когда мышь находится над Panel2 в событии Panel1 MouseLeave. Мой код выглядит так:
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
Я успешно вхожу в первое "если", но второе в "Для каждого" никогда не будет равным истине. Поэтому я подумал, что может быть проблема со 2-й панелью, поэтому я попытался разместить тот же код для Panel2 MouseLeave, но он работает просто отлично.
Мне действительно нужен этот код для работы с большой проблемой мерцания элемента управления, которая у меня возникла.
1 ответ
Спасибо Гансу Пассанту за подсказку. Мне просто нужно было вызвать 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