坐标系类型

GDI+ 使用三个坐标空间:世界、页面和设备。 世界坐标是用于建立特殊图形世界模型的坐标系,也是在 .NET Framework 中传递给方法的坐标系。 页面坐标系是指绘图图面(如窗体或控件)使用的坐标系。 设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系。 当调用 myGraphics.DrawLine(myPen, 0, 0, 160, 80) 时,传递给 DrawLine 方法的点((0, 0) 和 (160, 80))位于世界坐标空间内。 在 GDI+ 可以在屏幕上绘制线条之前,坐标先要经过一系列变换。 一种称为“世界变换”的变换可将世界坐标转换为页面坐标,而另一种称为“页面变换”的变换可将页面坐标转换为设备坐标。

变换和坐标系

假定您想使用原点位于工作区的主体而非左上角的坐标系统。 例如,您需要让原点位于距工作区左边缘 100 像素、距顶部 50 像素的位置。 下图显示了这样的坐标系统。

坐标系

当调用 myGraphics.DrawLine(myPen, 0, 0, 160, 80) 时,可得到下面的插图中所显示的线条。

坐标系

下表显示了三种坐标空间中线条终点的坐标:

World

(0, 0) 到 (160, 80)

页面

(100, 50) 到 (260, 130)

设备

(100, 50) 到 (260, 130)

请注意,页面坐标空间的原点在工作区的左上角,情况将总是如此。 另外请注意,由于度量单位是像素,所以设备坐标与页面坐标是相同的。 如果将度量单位设置为像素以外的其他单位(例如英寸),设备坐标将不同于页面坐标。

用于将世界坐标映射到页面坐标的世界变换保存在 Graphics 类的 Transform 属性中。 在前面的示例中,世界变换是在 x 方向平移 100 个单位、在 y 方向平移 50 个单位。 下面的示例设置了 Graphics 对象的世界变换,然后使用该 Graphics 对象绘制前图中显示的线条:

        myGraphics.TranslateTransform(100, 50)
        myGraphics.DrawLine(myPen, 0, 0, 160, 80)

myGraphics.TranslateTransform(100, 50);
myGraphics.DrawLine(myPen, 0, 0, 160, 80);

页面变换将页面坐标映射到设备坐标。 Graphics 类提供了用于操作页面变换的 PageUnitPageScale 属性。 Graphics 类还提供了两个只读属性:DpiXDpiY,用于检查显示设备每英寸的水平点数和垂直点数。

可使用 Graphics 类的 PageUnit 属性指定除像素以外的其他度量单位。

提示

不能将 PageUnit 属性设置为 World,因为这不是物理单元,将导致异常。

下面的示例从 (0, 0) 至 (2, 1) 绘制线条,其中点 (2, 1) 位于点 (0, 0) 的右边 2 英寸和下边 1 英寸处:

        myGraphics.PageUnit = GraphicsUnit.Inch
        myGraphics.DrawLine(myPen, 0, 0, 2, 1)

myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);

提示

如果在构造钢笔时没有指定钢笔的宽度,前面的示例将绘制一条一英寸宽的线条。 可以在 Pen 构造函数的第二个参数中指定钢笔的宽度:

        Dim myPen As New Pen(Color.Black, 1 / myGraphics.DpiX)

Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);

如果我们假定显示设备在水平方向和垂直方向每英寸都有 96 个点,则上例中直线的终结点在三个坐标空间中分别具有以下坐标:

World

(0, 0) 到 (2, 1)

页面

(0, 0) 到 (2, 1)

设备

(0, 0) 到 (192, 96)

请注意,由于世界坐标空间的原点在工作区的左上角,因此页面坐标与世界坐标相同。

您可以合并世界变换和页面变换,以实现多种效果。 例如,假定您想使用英寸作为度量单位,并且想让坐标系统的原点距工作区左边缘 2 英寸、距工作区顶部 1/2 英寸。 下面的示例设置 Graphics 对象的世界变换和页面变换,然后绘制一条从 (0, 0) 到 (2, 1) 的直线:

        myGraphics.TranslateTransform(2, 0.5F)
        myGraphics.PageUnit = GraphicsUnit.Inch
        myGraphics.DrawLine(myPen, 0, 0, 2, 1)

myGraphics.TranslateTransform(2, 0.5f);
myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);

下图显示了线条和坐标系统。

坐标系

如果我们假定显示设备在水平方向和垂直方向每英寸都有 96 个点,则上例中直线的终结点在三个坐标空间中分别具有以下坐标:

World

(0, 0) 到 (2, 1)

页面

(2, 0.5) 到 (4, 1.5)

设备

(192, 48) 到 (384, 144)

请参见

概念

变换的矩阵表示形式

其他资源

坐标系和坐标变换