Граница панорамирования Picturebox внутри панели

Мое изображение находится внутри панели, я установил оператор if для границы, которую можно только перемещать. Когда я пытался запустить его, он выглядел паршиво, когда мышь вывела его за границы. Вот мой код для панорамирования:

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
  Dim newY As Integer

  If PictureBox1.Location.X <= Panel1.Location.X And PictureBox1.Location.Y <= Panel1.Location.Y And _
  (PictureBox1.Location.X + PictureBox1.Width) >= (Panel1.Location.X + Panel1.Width) And _
  (PictureBox1.Location.Y + PictureBox1.Height) >= (Panel1.Location.Y + Panel1.Height) Then

    newX = PictureBox1.Location.X + deltaX
    newY = PictureBox1.Location.Y + deltaY
  End If

  PictureBox1.Location = New Point(newX, newY)

End If

person jko    schedule 02.07.2011    source источник


Ответы (1)


Прежде всего, если у вас есть 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