2016-02-13 4 views
0

Я разработал приложение для Windows в C#, где у меня есть pictureBox внутри панели. Я применил функцию увеличения и уменьшения масштаба. Теперь я хочу, чтобы изображение внутри pictureBox панорамировалось. Я применил mouseDown, mouseMove и mouseUp событие на pictureBox. Код для этого:Panning Image in pictureBox не работает

private void pictureBox2_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (pflag == 1) 
    { 
     dragging = true; 
     start = e.Location; 
    } 
} 

private void pictureBox2_MouseMove(object sender, MouseEventArgs e) 
{ 
    // panning code 
    if (pflag == 1) 
    { 
     if (dragging && zoom == 1) 
     { 
      pictureBox2.Location = new Point(pictureBox2.Left + (e.Location.X - start.X), pictureBox2.Top + (e.Location.Y - start.Y)); 
     } 
    } 
} 

private void pictureBox2_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (pflag == 1) 
    { 
     dragging = false; 
    } 
} 

Здесь изображение панорамируется, но без пограничного контроля. Иногда даже изображение проходит под панелью при панорамировании. Мне нужно здесь, изображение должно перемещаться сверху, влево, вправо, снизу в соответствии с коэффициентом масштабирования, например, как работает полоса прокрутки, а не дальше.

ответ

0

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

Вам также не нужна переменная dragging, если вы не используете ее для чего-то еще.

Однако вы должны проверить кнопку мыши во время MouseMove:

if (pflag == 1 && e.Button == System.Windows.Forms.MouseButtons.Left ) 

Do внимание несколько вещей:

  • Пользователь ожидает, что место он тащит пребывания с курсор мыши так же, как пиксель он касается sh ould всегда двигается кончиком пальца. Не удивляйте его масштабированием в коэффициенте масштабирования!

  • Если вы хотите сделать, что вам нужно будет использовать фактор, не добавление номер.

  • Да, скроллбары будет фактором в увеличении, но и лифт будет по-прежнему оставаться с помощью мыши!

Вот пример того, как установить лимиты, чтобы пользователь не заходил слишком далеко. Это немного связано с тем, что он должен работать при увеличении или уменьшении. Не начинайте с нелегальных позиций, хотя и не входите в них при масштабировании!

// panning code 
if (pflag == 1 && e.Button == System.Windows.Forms.MouseButtons.Left ) 
{ 
    { 
     Rectangle panRect = new Rectangle(panel1.Location, panel1.ClientSize); 
     Rectangle picRect = new Rectangle(pictureBox2.Location, pictureBox2.ClientSize); 
     int newLeft = pictureBox2.Left + (e.Location.X - start.X); 
     int newTop = pictureBox2.Top + (e.Location.Y - start.Y); 
     int newRight = newLeft + picRect.Width; 
     int newBottom = newTop + picRect.Height; 

     if ((newLeft < 0 && newRight < panRect.Width) 
     || (newLeft > 0 /*&& newRight > panRect.Width */)) newLeft = picRect.Left; 

     if ((newTop < 0 && newBottom < panRect.Width) 
     || (newTop > 0 /*&& newBottom > panRect.Height*/)) newTop = picRect.Top; 

     pictureBox2.Location = new Point(newLeft, newTop); 
    } 
    Text = "" + pictureBox2.Location; 
} 

Обратите внимание на две части, которые я прокомментировал! Поскольку вы не можете перемещать изображение, которое меньше, чем область просмотра; вы можете разрешить это, удалив комментарии, но затем позаботьтесь о том, чтобы переместить его вверх и оставить на ноль, так как он никогда не должен сидеть в диапазоне positve и также перекрывается, иначе полосы прокрутки будут вести себя странным образом ..!

+0

Я пробовал обновлять код в соответствии с вашим комментарием, но все тот же вопрос. Фактически во время масштабирования я увеличиваю размер pictureBox, но размер панели остается таким же. Когда я панорамирую изображение после его увеличения, местоположение pictureBox изменяется без ограничений. Я хочу, чтобы панорамирование соответствовало размеру панели плюс коэффициент масштабирования. 30. Помимо этого предела, если я панорамирую, изображение/изображение не следует перемещать. Функциональность должна быть такой, как полоса прокрутки. За пределами вертикальной и горизонтальной полосы прокрутки изображение нельзя перемещать или перемещать. –

+0

_I хочу, чтобы панорамирование соответствовало размеру панели плюс коэффициент масштабирования, скажем 30._ Это не имеет смысла! Панорамирование всегда должно следовать за мышью, а не быть быстрее или убегать от нее! _ Функциональность должна быть похожа на прокрутку. Ну, это должно пойти в другом направлении, не так ли? Если вы хотите ограничить это, вам просто нужно добавить его в код. Помимо этого он отлично работает здесь: он работает точно так же, как сенсорный экран, когда я перетаскиваю изображение влево, оно следует за кончиком пальца/мышью. – TaW

+0

Можете ли вы, пожалуйста, помочь мне с некоторым кодом, чтобы добавить лимит? –

 Смежные вопросы

  • Нет связанных вопросов^_^