как найти какой объект над другими - PullRequest
0 голосов
/ 28 июня 2018

У меня есть класс (форма) для рисования пользовательской фигуры на холсте, который я сделал раньше. Для проверки указателя мыши на форме я использовал событие canvase_mousemove и в цикле я проверяю shape.region.invisible(e.location) верно или нет (если true означает, что мышь находится над формой). Но когда два или более объекта перекрываются, «shape.region.invisible(e.location)» являются истинными, и я не могу найти, какой из них является вершиной других.

в классе формы:

Private _shapeRegion As Region
Public ReadOnly Property Region() As Region
    Get
        Return _shapeRegion
    End Get
End Property

Public Sub DrawShape(ByVal point As PointF, ByVal size As SizeF, ByRef graphics As Graphics)
    _shapePath = New GraphicsPath
    _shapePath.AddEllipse(New RectangleF(point, size))
graphics.DrawPath(_basePen, _shapePath)
graphics.FillPath(_baseBrush, _shapePath)
_shapeRegion = New Region(_shapePath) 
End Sub

на холсте:

 Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    MyBase.OnMouseMove(e)
    For Each _shape As Shape In _canvasShapes
    _shape.Highlight=_shape.Region.IsVisible(e.Location)
        _shape.ApplyProperties()
    Next
    Me.Invalidate()
End Sub

enter image description here

1 Ответ

0 голосов
/ 28 июня 2018

Я предполагаю, что вы рисуете фигуры в порядке их появления в списке shapes, поэтому сначала вы рисуете фигуру 0, затем фигуру 1 и т. Д.

Таким образом, форма с большим индексом - это форма сверху, и вы можете использовать обратную петлю For, чтобы найти ее:

Dim selectedIndex = -1
For index = shapes.Count-1 To 0 Step -1
    If(shapes(index).IsVisible(Point.Empty)) Then
        selectedIndex = index
        shapes(index).Highlight = True
        Exit For
    End If
Next
' selectedIndex contains the selected index

Я также рекомендую использовать Using при создании GraphicsPath и Region, например, при создании IsVisible:

Public Function IsVisible(pt As Point) As Boolean
    Using p As New GraphicsPath
        p.AddEllipse(New Rectangle(Location, Size))
        Return p.IsVisible(pt)
    End Using
End Function
...