enter image description here

Мой код при добавлении ярлыков на панель:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For i As Integer = 0 To 50
        Panel1.Controls.Add(New Label With {.BorderStyle = BorderStyle.FixedSingle, .AutoSize = False, .Visible = True, .Text = i.ToString, .Width = 50, .Dock = DockStyle.Left})
    Next
End Sub

Теперь, как получить видимые метки при прокрутке Panel, может быть, в событии Panel1.Scroll?

 Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then
        'HOW ?????
    End If
End Sub
1
titikjejak 21 Мар 2019 в 13:36

2 ответа

Лучший ответ

Вы можете использовать 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
0
Jimi 22 Мар 2019 в 10:21

Вы можете получить видимые метки при прокрутке. Вы должны посмотреть, какая метка находится в ClientRectangle из Panel1. Это видимая область Panel1.
В вашем вопросе не ясно, что вы хотите сделать с видимыми метками. Предположим, вы хотите написать имена видимых меток в Textbox1 при прокрутке Panel1. Вы можете сделать это с помощью следующего кода:

Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    Dim myBounds as Rectangle = Panel1.ClientRectangle
    TextBox4.Text = ""
    For Each control in Panel1.Controls
        Dim label as Label = CType(control,Label)
        if label.Location.X > myBounds.X And label.Location.X<myBounds.Width Or label.Location.X+label.Width>myBounds.X AND label.Location.X+label.Width<myBounds.Width Then
            TextBox4.Text +=  CType( control,Label).Text + vbCrLf
        End If
    Next
End Sub

Обратите внимание, что в приведенном выше подходе перечислены все частично видимые метки. Если вы просто хотите перечислить все метки, которые полностью видны, просто измените код:

Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    Dim myBounds as Rectangle = Panel1.ClientRectangle
    TextBox4.Text = ""
    For Each control in Panel1.Controls
        Dim label as Label = CType(control,Label)
        if label.Location.X > myBounds.X And label.Location.X<myBounds.Width AND label.Location.X+label.Width>myBounds.X AND label.Location.X+label.Width<myBounds.Width Then
            TextBox4.Text +=  CType( control,Label).Text + vbCrLf
        End If
    Next
End Sub
0
Code Pope 21 Мар 2019 в 11:55