平移图片框中的图像不起作用

问题描述:

我已经在c#中开发了Windows应用程序,其中我有一个panelBox内的pictureBox。我已经应用了放大和缩小功能。现在我想让pictureBox中的图像平移。我在pictureBox上应用了mouseDown,mouseMove和mouseUp事件。它的代码是:平移图片框中的图像不起作用

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; 
    } 
} 

这里图像是平移但没有边界控制。有时即使图像在平移时也会在面板区域下方。我需要的是,图像应根据缩放因子移动顶部,左侧,右侧,底部,即滚动条的工作方式,而不是超出此范围。

您不需要担心缩放,因为鼠标坐标会很好。所示像素的距离应与光标正在移动的距离相同。

您也并不真的需要dragging变量,除非您将其用于别的东西。

然而,你需要在MouseMove检查鼠标按钮:

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

待办事项几件事情:

  • 用户预计了现场,他拖住宿与鼠标光标就像像素触摸 sh应该总是随着指尖移动。不要通过缩放缩放系数来让他感到惊讶!

  • 如果你想这样做,你将需要使用一个因素,不加入数量。

  • 是,滚动条会因素,在变焦也是电梯仍然将留用鼠标!

这里是一个如何设置限制以防止用户走得太远的例子。它有点牵扯,因为它在放大或缩小时需要工作。不要从非法职位开始,但在缩放时也不要进入这些职位!

// 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; 
} 

请注意我已注释的两部分!因为它不能移动小于视口的图片;你可以通过删除注释来允许它,但是应该在放大时将它放大并保持为零,因为它应该永远不会坐在位置范围内并且也会与重叠,否则滚动条会以怪异方式行为..!

+0

我试着根据你的评论更新代码,但仍然是同样的问题。实际上,在放大时我增加了我的pictureBox尺寸,但面板尺寸保持不变。当我缩放图像后平移图像时,图像框位置将不受限制地改变。我希望根据面板大小加上缩放因子说明30。如果我正在平移,超出该限制,不应移动pictureBox/image。该功能应该像滚动条。超出垂直和水平滚动条的限制时,图像不应移动或移动。 –

+0

_我想要根据面板大小加上缩放因子说30。这没有任何意义!平移总是应该跟着鼠标,不要更快或者离开它! _功能应该像滚动条._它应该在另一个方向,对吧?如果你想限制它,你只需要将它添加到代码中。除此之外,它在这里工作得很好:它的工作方式与触摸屏完全相同,当我将图像拖动到左侧时,它跟随着指尖/鼠标。 – TaW

+0

您能否帮我解决一些代码以增加限制? –