我怎样才能确保物体不会形成

时间:2017-03-14 17:38:05

标签: vb.net winforms

所以我的表单中有一个对象,它可以用箭头键移动。如果我的对象试图离开表单,那么交互应该被阻止或在它试图离开的地方回归或者将传送到表单的中心。我怎样才能做到这一点?我的对象是一个图片框。 这是我现在唯一拥有的东西:

If picturebox1.location.x < 0 or picturebox1.location.y < 0 then
picturebox1.location = new point(10,10)
End if

是否有代码可以说它是否会离开表单?

1 个答案:

答案 0 :(得分:1)

此功能可以为您完成。如评论中所述,您还需要检查容器边界。

Private Sub moveControlInContainer(control As Control, container As Control, x As Integer, y As Integer)
    Dim newLocation = New System.Drawing.Point(control.Location.X + x, control.Location.Y + y)
    If newLocation.X < 0 Then
        newLocation.X = 0
    ElseIf newLocation.X + control.Width > container.ClientRectangle.Width Then
        newLocation.X = container.ClientRectangle.Width - control.Width
    End If
    If newLocation.Y < 0 Then
        newLocation.Y = 0
    ElseIf newLocation.Y + control.Height > container.ClientRectangle.Height Then
        newLocation.Y = container.ClientRectangle.Height - control.Height
    End If
    control.Location = newLocation
End Sub

像这样称呼

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    Dim v = 5
    Dim x = 0, y = 0
    Select Case e.KeyCode
        Case Keys.Left
            x = -1
        Case Keys.Right
            x = 1
        Case Keys.Up
            y = -1
        Case Keys.Down
            y = 1
    End Select
    moveControlInContainer(Me.PictureBox1, Me, x * v, y * v)
End Sub

Me替换为PictureBox所在的任何容器(如果在面板或组框等中),或者如果它只是在表单上,​​请保持原样。您也可以从KeyPressKeyDown事件处理程序调用该函数,但使用相应的事件参数。使用v控制每按一次键移动的像素数。

修改以解决评论中的问题:

关于Control.ClientRectangle

  

控件的客户区域是控件的边界,减去非客户端元素,如滚动条,边框,标题栏和菜单。

     

因为客户端坐标是相对于控件的客户区域的左上角,所以此属性返回的矩形左上角的坐标是(0,0)。您可以使用此属性来获取控件的客户区域的大小和坐标,以便在控件的表面上绘制任务。

moveControlInContainer有四个参数:

  • control As Control,您想要移动的控件。
  • container As Control,包含控件的容器。如果没有表单以外的容器,只需传递表单。
  • x As Integer,向右移动的像素数。如果向左移动,请使用负数。
  • y As Integer要向下移动的像素数。如果向上移动,请使用负数。

图片的位置是图片左上角像素的坐标。当您移动它时,如果您只检查位置是否为正,那么您将能够将图片移动到除表格的左边界或上边界之外的任何位置。您还必须检查右边框和底边框。但由于您仅使用左上角的像素位置,因此还必须包括图片的高度和宽度。这就是我们在moveControlInContainer函数

中执行此操作的方式
  • 首先,从x和y计算新位置。
  • 如果水平坐标小于零,则将其设置为零。这可以防止控件移过表单的左边框。
  • 如果水平坐标不小于零,请检查水平坐标加上图片的宽度是否超​​出表格边界(客户矩形)。如果控件的水平位置加上宽度大于容器的宽度,请将其设置为极限点,同时将其保持在容器中(容器宽度减去控件宽度)。
  • 与垂直坐标
  • 类似