2013-12-17 82 views
0

我在C#中的WinFroms应用程序中绘制了一个矩形,我想在应用ScaleTransform后得到矩形的实际坐标。缩放后的实际坐标

Graphics g = e.Graphics; 
g.ScaleTransform(2.0F,2.0F,System.Drawing.Drawing2D.MatrixOrder.Append); 
g.DrawRectangle(pen, 20, 40, 100,100) 

回答

1

一旦你已经在你的Graphics对象设置ScaleTransform(或任何变换为此事),你可以用它来改变你的矩形的点(或任何其他点)。

例如:

// 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说:

由于矩阵返回,并且由变换特性是 几何副本变换,你应该处理矩阵,当你没有 更需要它。

作为一个略少罗嗦替代方法,可以使用Graphics类的TransformPoints方法(MSDN here)做同样的事情 - 这样构建如上贵点阵列,那么就这样做:

g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, pPoints); 

MSDN描述了上述功能中使用的相关的坐标空间:

GDI +使用三个坐标空间:世界,页面和设备。世界 坐标是用于建模特定图形的坐标,并且是您传递给.NET Framework中方法的坐标。页面坐标指的是一个 绘图表面使用的坐标系统,例如窗体或控件。设备坐标是要绘制的物理设备使用的坐标,如 屏幕或打印机。 Transform属性表示将世界坐标映射到页面坐标的世界 转换。

+1

非常感谢Roger.You帮助了我很多,现在它可以工作!我希望我有足够的声望来投票您的答案。 :) – evanchai