投稿者 るきお  (社会人) 投稿日時 2020/3/31 08:44:37
それでは、testButtons_MouseUp をたとえば次のように修正するとよいと思います。

Private Sub testButtons_MouseUp(sender As Object, e As MouseEventArgs)

    'イベントを発生させたボタンを取得します。 
    'これはこの瞬間のマウスの座標とは関係なくMouseDownを発生させたボタンを同じです。 
    Dim eventSourceControl As Button = DirectCast(sender, Button)

    'この瞬間のマウスの位置の下にあるコントロールを取得します。 
    Dim xInParent As Integer = e.Location.X + eventSourceControl.Location.X
    Dim yInParent As Integer = e.Location.Y + eventSourceControl.Location.Y
    Dim locationInParent As New Point(xInParent, yInParent)
    Dim controlMouseOn As Control = Me.GetChildAtPoint(locationInParent)

    'マウスの下に何かコントロールがあるのであれば、それの背景色を変更します。 
    If controlMouseOn IsNot Nothing Then
        controlMouseOn.BackColor = Color.Blue
    End If

End Sub


MouseUpイベントはそのときのマウスの位置とは関係がなく、MouseDownイベントを発生させたボタンと同じボタンで発生します。
MouseUpイベントでのsenderはMouseDownイベントでのsenderと同じコントロールを指します。

一方、今回 kojiro さんは、そうではなく、マウスアップした瞬間にマウスの下にあったボタンの色を青くしたいということなので、senderではなく、マウスの座標をもとにその座標にあるコントロールを取得する必要があります。これにはGetChildAdPointメソッドを使用します。

イベントの引数(e.Location)が表す座標は、イベントを発生させたボタンの左上が(0,0)という座標系ですので、フォームの座標系に変換するためにそのボタンの座標をたし算をしています。

この構造にすると、コントロールがどのような階層構造で配置されているかが重要になります。この例ではフォームに直接配置されているのでフォームのGetChildAtPointメソッドを使っていますが、PanelやPictureBoxなどフォームでないものに配置しているのであれば、変える必要がありますし、汎用で作るのは少し面倒になります。