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

本文关键字:图像 不起作用 | 更新日期: 2023-09-27 18:34:31

我用c#开发了Windows应用程序,其中面板内有一个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  )

请注意以下几点:

  • 用户希望他拖动的位置停留在鼠标光标上,就像他触摸像素应始终随指尖移动一样。不要通过缩放因子来让他感到惊讶!

  • 如果你想这样做,你需要使用一个因子,而不是添加一个数字。

  • 是的,滚动条将考虑缩放,但提升仍将与鼠标保持在一起!

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

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

请注意我注释掉的两个部分!实际上,您无法移动小于视口的图片;您可以通过删除注释来允许它,但在放大时应小心将其向上移动并保留为零,因为它永远不应该位于正值范围内并且也会重叠,否则滚动条的行为会很奇怪..!