我在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;
}
}
此处图像正在平移但没有边界控制。有时甚至在平移时图像也会低于面板区域。我需要的是,图像应根据缩放系数移动顶部,左侧,右侧,底部,即滚动条如何工作而不是超出该范围。
答案 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;
}
请注意我已注释掉的两个部分!因为它是你不能移动小于视口的图片;您可以通过删除评论来允许它,但是在放大时要小心将其向上移动并保持为零,因为它不应该位于正面范围内且也重叠否则滚动条会表现得很奇怪..!