Picturebox Panning Boundary внутри панели - PullRequest
2 голосов
/ 02 июля 2011

Мое изображение находится внутри панели, я установил оператор 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

1 Ответ

1 голос
/ 04 июля 2011

Прежде всего, если у вас есть PictureBox внутри вашей панели, то вам не нужно учитывать местоположение панели, так как местоположение PictureBox будет обнулено в верхнем левом углу Панель.

Это условие:

If PictureBox.Location.X <= Panel1.Location.X ...

следует изменить на это условие:

If PictureBox.Location.X <= 0

1011 *
*

Кроме того, проблема, с которой вы сталкиваетесь, связана с тем, что ваш обработчик событий переключается между перемещением PictureBox с 0,0 на перемещение PictureBox в местоположение дельты.

Например:
Когда вы перетаскиваете PictureBox вправо так, что его левая граница проходит за левую границу Panel (т.е. 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
...