Вы можете использовать методы Rectangle.Contains и Rectangle.IntersectWith , чтобы определить, является ли элемент управления полностью или частично видимым внутри контейнера.
Используя Rectangle.Contains
, вы можете определить, полностью ли включен прямоугольник, определенный элементом Bounds
элемента управления, в прямоугольник, определенный контейнером ClientRectangle
.
Используя Rectangle.IntersectWith
, вы можете определить, видна ли она только частично.
Этот метод позволяет вам указать, какие элементы управления следует учитывать: элементы управления, которые полностью видимы или только частично видны внутри своего Контейнерного элемента управления (в данном случае Panel).
В примере:
Dim visibleLabels = GetVisibleControls(CType(sender, Control), e.NewValue, False)
вернет коллекцию элементов управления (в данном случае меток), которые полностью видны внутри контейнера Panel1.
Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then
Dim visibleLabels = GetVisibleControls(CType(sender, Control), e.NewValue, False)
End If
End Sub
Private Function GetVisibleControls(container As Control, ScrollPosition As Integer, allowPartial As Boolean) As IEnumerable(Of Control)
Dim ctrls = New List(Of Control)
Dim rect As Rectangle = container.ClientRectangle
For Each ctl As Control In container.Controls
If allowPartial Then
If ctl.Bounds.IntersectsWith(rect) Then
ctrls.Add(ctl)
End If
Else
If rect.Contains(ctl.Bounds) Then
ctrls.Add(ctl)
End If
End If
Next
Return ctrls
End Function