坐标系类型

Windows GDI+ 使用三个坐标空间:世界、页面和设备。 调用 myGraphics.DrawLine(&myPen, 0, 0, 160, 80)时,传递给 Graphics::D rawLine 方法的点( (0,0) 和 (160,80) )位于世界坐标空间中。 在 GDI+ 在屏幕上绘制线之前,坐标要经过一系列转换。 一个转换将世界坐标转换为页面坐标,另一个转换将页面坐标转换为设备坐标。

假设你想要使用一个坐标系统,该坐标系的原点位于工作区的主体,而不是左上角。 例如,假设你希望原点距工作区左边缘 100 个像素,距工作区顶部 50 个像素。 下图显示了这样的坐标系。

包含标记坐标轴的窗口的屏幕截图

调用 myGraphics.DrawLine(&myPen, 0, 0, 160, 80) 时,你将得到如下图所示的线。

上一个窗口的屏幕截图,但从原点向对角线延伸的蓝线

三个坐标空间中线的终结点的坐标如下所示:

Space 终结点坐标
World (0, 0) 到 (160, 80)
(100, 50) 到 (260, 130)
设备 (100, 50) 到 (260, 130)

 

请注意,页面坐标空间的原点位于工作区的左上角;永远都是这样。 另请注意,由于度量单位是像素,因此设备坐标与页面坐标相同。 如果将度量单位设置为像素以外的其他单位(例如英寸),则设备坐标将不同于页面坐标。

将世界坐标映射到页面坐标的转换称为 世界转换 ,由 Graphics 对象维护。 在前面的示例中,世界转换是 x 方向的平移 100 个单位,在 y 方向为 50 个单位。 以下示例设置 Graphics 对象的世界转换,然后使用该 Graphics 对象绘制上图中显示的线条。

myGraphics.TranslateTransform(100.0f, 50.0f);

myGraphics.DrawLine(&myPen, 0, 0, 160, 80);

将页面坐标映射到设备坐标的转换称为 页面转换Graphics 类提供四种用于操作和检查页面转换的方法:Graphics::SetPageUnitGraphics::GetPageUnitGraphics::SetPageScaleGraphics::GetPageScaleGraphics 类还提供两种方法:Graphics::GetDpiXGraphics::GetDpiY,用于检查显示设备每英寸的水平点和垂直点数。

可以使用 Graphics 类的 Graphics::SetPageUnit 方法指定度量单位。 以下示例从 (0, 0) 到 (2, 1) 绘制一条线,其中 (2, 1) 的点向右 2 英寸,从点 (0, 0) 向下 1 英寸。

myGraphics.SetPageUnit(UnitInch);

myGraphics.DrawLine(&myPen, 0, 0, 2, 1);

注意

如果在构造触控笔时未指定笔宽度,上一示例将绘制一条宽度为 1 英寸的线条。 可以在 Pen 构造函数的第二个参数中指定 宽度:

Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX()).

 

如果假定显示设备在水平方向上每英寸有 96 点,垂直方向每英寸有 96 点,则上一示例中线条的端点在三个坐标空间中具有以下坐标:

Space 终结点坐标
World (0, 0) 到 (2, 1)
(0, 0) 到 (2, 1)
设备 (0、0 到 (192、96)

 

可将世界转换和页面转换组合在一起,以实现各种效果。 例如,假设你想使用英寸作为度量单位,并且你希望坐标系的原点距离工作区的左边缘 2 英寸,距离工作区的顶部 1/2 英寸。 以下示例设置 Graphics 对象的世界和页面转换,然后绘制一条线从 (0, 0) 到 (2, 1) 。

myGraphics.TranslateTransform(2.0f, 0.5f);
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);

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

上一个窗口的屏幕截图,但较宽,轴位于左侧,标记方式不同

如果假定显示设备在水平方向上每英寸有 96 点,垂直方向每英寸有 96 点,则上一示例中线条的端点在三个坐标空间中具有以下坐标:

Space 终结点坐标
World (0, 0) 到 (2, 1)
(2, 0.5) 到 (4, 1.5)
设备 (192, 48) 到 (384, 144)