1

我想为应用程序添加缩放功能,其核心是 spf 图形应用程序。现在我目前没有缩放,但能够在图形窗口中的图形上选择/移动、多选对象。我开始编写自己的代码来缩放对象,然后计算鼠标坐标以正确映射点击和重绘。我没有完成这个,因为我找到了 Gdiplus::SetPageScale 函数,它可以很好地缩放窗口,但我看不到任何 GDI 函数,我可以使用它来将鼠标点击坐标从世界坐标映射到页面坐标。我尝试了 TransformPoints(Gdiplus::CoordinateSpaceWorld, ::Gdiplus::CoordinateSpacePage, points, 2) 但这不会转换点并且返回的点是 (0,0)。

那么这甚至可以使用 Gdiplus 还是我需要自己编写这个映射?任何建议表示赞赏!

4

2 回答 2

0

在这种情况下,您不想使用 Graphics::SetPageScale()。更通用的方法是改用 Matrix 类。它的 Scale、Translate 和 Rotate 方法可以方便地获得您需要的矩阵。您需要在此处使用 Scale() 方法,可能使用 Translate() 来更改原点。

在开始绘制之前,使用 Graphics::SetTransform() 方法激活矩阵。现在,您绘制的任何内容都将根据您传递给 Matrix::Scale() 方法的参数自动缩放。使用 Matrix::TransformPoints() 方法映射鼠标位置现在非常简单,现在将绘制时使用的完全相同的变换应用于鼠标坐标。即使从图形坐标返回到鼠标坐标也很简单,使用 Matrix::Invert() 方法来获得逆变换。

于 2013-06-01T18:13:20.583 回答
0

当 GDI+ 绘图时,它应用世界变换(由 Graphics::SetTransform、ScaleTransform 等控制),然后是页面变换(由 Graphics::SetPageScale 和 Graphics::SetPageUnit 控制)将点变换到设备坐标。

所以它通常是这样的:世界坐标--[世界变换]-->页面坐标--[页面变换]-->设备坐标

您可以按照您想要的方式使用 Graphics::TransformPoints 将鼠标坐标映射到世界坐标,但是您必须将设备坐标指定为源空间,将世界坐标指定为目标空间。

但是,正如 Hans 所描述的那样,您有充分的理由使用您单独存储的 Matrix 来执行此操作,最值得注意的是,您不应该将 Graphics 对象保持足够长的时间来处理鼠标输入(也不应该需要创建一个然后)。

于 2013-06-03T05:10:55.980 回答