我已经在这个问题上折腾了大约一个小时了。
我有一个支持平移和缩放的视口,平移是通过存储 X 和 Y 轴的偏移来处理的。缩放只是一个从 0.2 到 14 的浮动值。
我的问题是,我需要能够将内容放置在用户在视口中单击的位置,但是当我缩放和平移时,鼠标坐标不正确。我一直无法弄清楚如何正确计算鼠标坐标。
这是一张显示我到目前为止所拥有的内容的图片:https://i.stack.imgur.com/3hKHH.png https://i.stack.imgur.com/3hKHH.png
正如您所看到的,鼠标原点始终位于视口组件的左上角。您可以在图像左下角看到平移 X 和 Y 偏移以及缩放值。我还添加了一个与视口左上角相关的鼠标坐标的示例。
现在,由于在该图像中,当前放大的对象我放置的对象将被偏移。
感谢您的时间!
使用适合我的案例的解决方案进行编辑:
void Viewport_MouseClick(object sender, MouseEventArgs e){
Point mousePosition = new Point((int)((e.X - Pan.X) / Zoom),
(int)((e.Y - Pan.Y) / Zoom));
}
这会计算正确的“屏幕空间”鼠标位置,同时考虑平移和缩放。
我通过尝试 TaWs 答案得到了这个解决方案。感谢您的帮助! :)
使用 TrackBar 进行缩放,再使用两个 TrackBar 进行偏移,这似乎有效:
private void panel1_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bmp = new Bitmap(filename))
{
e.Graphics.ScaleTransform(zoom, zoom);
e.Graphics.DrawImage(bmp, trb_offsetX.Value, trb_offsetY.Value);
}
}
float zoom = 1f;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
Point mouseLocation = e.Location;
Point imageLocation = new Point((int)((mouseLocation.X / zoom - trb_offsetX.Value)),
(int)((mouseLocation.Y / zoom - trb_offsetY.Value)));
st_mousePos.Text = " " + imageLocation.ToString();
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
zoom = trackBar1.Value;
panel1.Invalidate();
}
我已经添加了 Paint 事件的代码,因此您可以看看这是否也是您处理它的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)