Прежде всего, если у вас есть PictureBox внутри панели, вам не нужно учитывать расположение панели, так как расположение PictureBox будет обнулено в верхнем левом углу панели. .
Это условие:
If PictureBox.Location.X <= Panel1.Location.X ...
следует изменить на это условие:
If PictureBox.Location.X <= 0
Кроме того, проблема, с которой вы сталкиваетесь, связана с тем, что ваш обработчик событий переключается между перемещением PictureBox с 0,0 на перемещение PictureBox в дельта-местоположение.
Например:
Когда вы перетаскиваете PictureBox вправо так, что его левая граница выходит за левую границу панели (т. е. PictureBox.Location.X > 0), тогда условие вашего оператора if оценивается как False, а местоположение PictureBox имеет значение 0. Однако, поскольку вы теперь изменили его местоположение, событие MouseMove запускается снова, и на этот раз условие вашего оператора if оценивается как True, а местоположение PictureBox устанавливается в дельта-местоположение. Еще раз запускается событие MouseMove, и сценарий повторяется, переворачивая расположение PictureBox вперед и назад, вызывая эффект дрожания.
Вы можете исправить это, изменив свое условие, чтобы полагаться на новое местоположение PictureBox, а не на текущее местоположение:
Это условие:
If PictureBox.Location.X <= 0 ...
следует изменить на это условие:
If (PictureBox.Location.X + deltaX) <= 0 ...
Это устраняет проблему дрожания, но ваш код заботится только о случае, когда PictureBox перетаскивается вправо и вниз.
Вместо того, чтобы писать дополнительные условия, вы можете упростить свой код, переместив вычисления в отдельную функцию, которая обрабатывает каждую ось отдельно:
If (mouse.Button = Windows.Forms.MouseButtons.Left) Then
Dim mousePosNow As Point = mouse.Location
Dim deltaX As Integer = mousePosNow.X - mouseDowns.X
Dim deltaY As Integer = mousePosNow.Y - mouseDowns.Y
Dim newX As Integer = Clamp(PictureBox1.Location.X + deltaX, PictureBox1.Width, Panel1.Width)
Dim newY As Integer = Clamp(PictureBox1.Location.Y + deltaY, PictureBox1.Height, Panel1.Height)
PictureBox1.Location = New Point(newX, newY)
End If
...
Private Function Clamp(val As Integer, outerBound As Integer, innerBound As Integer) As Integer
Dim newVal As Integer = val
If newVal > 0 Then
newVal = 0
End If
If newVal + outerBound < innerBound Then
newVal = innerBound - outerBound
End If
Return newVal
End Function
person
brianpeiris
schedule
04.07.2011