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)
时,将得到如在下图所示的线。
三个坐标空间中线条端点的坐标如下所示:
坐标空间 | 终结点坐标 |
---|---|
世界 | (0, 0) 至 (160, 80) |
页 | (100, 50) 至 (260, 130) |
装置 | (100, 50) 至 (260, 130) |
请注意,页面坐标空间的原点位于工作区左上角;这种情况始终如此。 另请注意,由于度量单位是像素,因此设备坐标与页面坐标相同。 如果将度量单位设置为除像素以外的内容(例如英寸),则设备坐标将与页面坐标不同。
将世界坐标映射到页面坐标的世界转换保存在 Transform 类的 Graphics 属性中。 在前面的示例中,世界转换是在 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 类提供用于操作页面转换的 PageUnit 和 PageScale 属性。 Graphics 类还提供了两个只读属性 DpiX 和 DpiY,用于检查显示设备每英寸的水平和垂直点数。
可以使用 PageUnit 类的 Graphics 属性来指定除像素以外的度量单位。
以下示例绘制了一条从 (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 构造函数的第二个参数中指定笔宽:
Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);
Dim myPen As New Pen(Color.Black, 1 / myGraphics.DpiX)
假设显示设备在水平方向有 96 个点/英寸,垂直方向有 96 个点/英寸,则上例中线条的端点在三个坐标空间中具有以下坐标:
坐标空间 | 终结点坐标 |
---|---|
世界 | (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 个点/英寸,垂直方向有 96 个点/英寸,则上例中线条的端点在三个坐标空间中具有以下坐标:
坐标空间 | 终结点坐标 |
---|---|
世界 | (0, 0) 至 (2, 1) |
页 | (2, 0.5) 至 (4, 1.5) |
装置 | (192, 48) 至 (384, 144) |