所以我的表单中有一个对象,它可以用箭头键移动。如果我的对象试图离开表单,那么交互应该被阻止或在它试图离开的地方回归或者将传送到表单的中心。我怎样才能做到这一点?我的对象是一个图片框。 这是我现在唯一拥有的东西:
If picturebox1.location.x < 0 or picturebox1.location.y < 0 then
picturebox1.location = new point(10,10)
End if
是否有代码可以说它是否会离开表单?
答案 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所在的任何容器(如果在面板或组框等中),或者如果它只是在表单上,请保持原样。您也可以从KeyPress
或KeyDown
事件处理程序调用该函数,但使用相应的事件参数。使用v
控制每按一次键移动的像素数。
修改以解决评论中的问题:
控件的客户区域是控件的边界,减去非客户端元素,如滚动条,边框,标题栏和菜单。
因为客户端坐标是相对于控件的客户区域的左上角,所以此属性返回的矩形左上角的坐标是(0,0)。您可以使用此属性来获取控件的客户区域的大小和坐标,以便在控件的表面上绘制任务。
moveControlInContainer
有四个参数:
control As Control
,您想要移动的控件。container As Control
,包含控件的容器。如果没有表单以外的容器,只需传递表单。x As Integer
,向右移动的像素数。如果向左移动,请使用负数。y As Integer
要向下移动的像素数。如果向上移动,请使用负数。图片的位置是图片左上角像素的坐标。当您移动它时,如果您只检查位置是否为正,那么您将能够将图片移动到除表格的左边界或上边界之外的任何位置。您还必须检查右边框和底边框。但由于您仅使用左上角的像素位置,因此还必须包括图片的高度和宽度。这就是我们在moveControlInContainer
函数