在PictureBox中平移图像不起作用

时间:2016-02-13 11:37:05

标签: c# picturebox panning

我在c#中开发了windows应用程序,我在面板中有一个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;
    }
}

此处图像正在平移但没有边界控制。有时甚至在平移时图像也会低于面板区域。我需要的是,图像应根据缩放系数移动顶部,左侧,右侧,底部,即滚动条如何工作而不是超出该范围。

1 个答案:

答案 0 :(得分:0)

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

您也不需要dragging变量,除非您将其用于其他内容。

但是,您需要在MouseMove

期间检查鼠标按钮
    if (pflag == 1  && e.Button == System.Windows.Forms.MouseButtons.Left  )

请注意几件事:

  • 用户期望他用鼠标光标拖动的位置就像像素 触及< / strong>应该始终用指尖移动。不要通过缩放缩放系数来让他感到惊讶!

  • 如果您想这样做,则需要使用系数,而不是添加数字。

  • 是的,滚动条会影响缩放,但提升仍会保持鼠标!

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

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

请注意我已注释掉的两个部分!因为它是你不能移动小于视口的图片;您可以通过删除评论来允许它,但是在放大时要小心将其向上移动并保持为零,因为它不应该位于正面范围内且重叠否则滚动条会表现得很奇怪..!