我现在已经纠结了这个问题大约一个小时了。
我有一个支持平移和缩放的视口,通过存储X和Y轴的偏移来处理平移。缩放只是从0.2到14的浮动。
我的问题是我需要能够在用户在视口中点击的位置放置内容,但是当我缩放和平移时鼠标坐标不正确。我还没有弄清楚如何正确计算鼠标坐标。
这是一张显示我目前所拥有的图片:http://i.imgur.com/WQSXKJ2.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答案得到了解决方案。感谢您的帮助! :)
答案 0 :(得分:1)
使用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事件的代码,因此您可以看到这是否也是您处理它的方式。
答案 1 :(得分:0)
将图片放入PictureBox,然后计算鼠标的相对位置。那是
double Pic_width = orginal_image_width/ pictureBox.width;
double Pic_height = orginal_image_height/ pictureBox.height;
var mouseArgs = (MouseEventArgs)e;
int xpoint = Convert.ToInt16(mouseArgs.X * Pic_width);
int ypoint = Convert.ToUInt16(mouseArgs.Y * Pic_height);
此代码将为您提供光标在图像中的位置。