我在C#中的WinForms应用程序中绘制一个矩形,我希望在应用ScaleTransform
后得到矩形的实际坐标。
Graphics g = e.Graphics;
g.ScaleTransform(2.0F,2.0F,System.Drawing.Drawing2D.MatrixOrder.Append);
g.DrawRectangle(pen, 20, 40, 100,100)
答案 0 :(得分:2)
在ScaleTransform
对象(或任何变换)中设置Graphics
后,您可以使用它来变换矩形(或任何其他点)的点。
例如:
// your existing code
Graphics g = e.Graphics;
g.ScaleTransform(2.0F,2.0F,System.Drawing.Drawing2D.MatrixOrder.Append);
// say we have some rectangle ...
Rectangle rcRect = new Rectangle(20, 40, 100, 100);
// make an array of points
Point[] pPoints =
{
new Point(rcRect.Left, rcRect.Top), // top left
new Point(rcRect.Right, rcRect.Top), // top right
new Point(rcRect.Left, rcRect.Bottom), // bottom left
new Point(rcRect.Right, rcRect.Bottom), // bottom right
};
// get a copy of the transformation matrix
using (Matrix mat = g.Transform)
{
// use it to transform the points
mat.TransformPoints(pPoints);
}
请注意上面的using
语法 - 这是因为,正如MSDN所说:
因为返回的矩阵和Transform属性是一个副本 你不应该在几何变换时处理矩阵 更需要它。
作为一个稍微不那么冗长的替代方案,你可以使用TransformPoints
类(MSDN here)的Graphics
方法做同样的事情 - 所以如上所述构建你的点数组,然后这样做:
g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, pPoints);
MSDN描述了上述函数中使用的相关坐标空间:
GDI +使用三个坐标空间:世界,页面和设备。世界 坐标是用于建模特定图形的坐标 world,是您传递给.NET中方法的坐标 框架。页面坐标是指a使用的坐标系 绘图表面,例如表格或控件。设备坐标是 被绘制的物理设备使用的坐标,例如a 屏幕或打印机。 Transform属性代表世界 转换,将世界坐标映射到页面坐标。