平移图片框中的图像不起作用
本文关键字:图像 不起作用 | 更新日期: 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;
}
请注意我注释掉的两个部分!实际上,您无法移动小于视口的图片;您可以通过删除注释来允许它,但在放大时应小心将其向上移动并保留为零,因为它永远不应该位于正值范围内并且也会重叠,否则滚动条的行为会很奇怪..!