我正在制作一个图形程序并且我停留在需要将鼠标坐标设置为相同图形比例的位置。使用picturebox我使用transform来缩放我的图形:
RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt);
PointF[] device_points =
{
new PointF(0, PictureBox1.ClientSize.Height),
new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height),
new PointF(0, 0),
};
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
我使用MouseMove功能。有没有办法转换鼠标坐标?当我把鼠标放在x = 9上时,我需要将鼠标坐标设为9.
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Console.WriteLine(e.X);
}
答案 0 :(得分:2)
汉斯'评论意味着,您可以使用第二个Matrix
来完成此任务。您可以通过复制原始Matrix
并调用副本的Invert()
方法来获取它,也可以通过从原始方向反转输入矩形来从头创建新的Matrix
IMHO反转更容易,但它确实意味着您需要创建逆矩阵并将其存储在某处。 E.g:
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
inverseTransform = transform.Clone();
inverseTransform.Invert();
其中inverseTransform
是您的类中的字段而不是局部变量,因此您的鼠标处理代码可以在以后使用它。
如果你必须稍后构建Matrix
,你可以这样做:
RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize);
PointF[] world_points =
{
new PointF(wxmin, wymin + whgt),
new PointF(wxmin + wwid, wymin + whgt),
new PointF(wxmin, wymin),
};
Matrix inverseTransform = new Matrix(device, world_points);
在任何一种情况下,您只需在鼠标处理代码中使用Matrix.TransformPoints()
方法将逆变换应用于鼠标坐标即可返回世界坐标。