GDI中的坐标映射问题(2)

来源:互联网 发布:db2查看正在执行的sql 编辑:程序博客网 时间:2024/06/11 02:13

2.从Windows系统的角度来看GDI坐标映射。

首先我们从Windows系统的角度来看坐标映射是如何进行的,或者说来看看,Windows是如何将我们在程序中使用的逻辑空间坐标值转换成为物理设备空间坐标值的。它通常分成以下3个步骤。

第1步,world空间 → page空间。如果程序员使用SetWorldTransform函数明确定义了world空间向page空间映射的公式,那么windows将进行这种映射,具体规则由SetWorldTransform函数定义,此时的逻辑空间是world空间,。

如果没有出现SetWorldTransform函数,Windows将不进行world空间到page空间的映射,而直接进行page空间到device空间的映射,此时的逻辑空间是page空间。

事实上world空间是Windows98以后才引入的,我们一般情况下是用不到它的。但是如果我们要将逻辑空间以一种“扭曲”的方式在物理设备上表现出来,world坐标空间是一个非常好的工具。

第2步,page空间 → device空间。这是我们程序员最关心的一个映射步骤,映射规则是:

其中,Di表示x或者y方向的设备空间坐标,单位是像素(pixel);

Li表示x或者y方向的page空间坐标,单位是逻辑单位(即自己定义);

L0表示window的原点在page空间中的坐标值,单位是逻辑单位;

WE表示window的宽(高)度,由SetWindowExtEx(W, H)函数确定,单位是逻辑单位。

VE表示viewport的宽(高)度,由SetViewportExtEx(W, H)函数确定,单位是像素。

D0表示viewport的原点在device空间中的坐标值,单位是像素。

看不太明白不要紧,因为我们并不需要操心这个公式,让Windows去头疼好了,不过基本的原理我们还是要了解的,这样才能对坐标映射有更深的了解,这也是我将公式写出来的原因。

第3步,device空间 → physical device空间。这一映射遵从一对一原则,即device空间的一个像素就是physical device空间的一个像素,并且它们的坐标原点在物理设备的左上角,坐标方向是x轴正向向右,y轴正向向下,记住是向下!。这个映射的规则我们程序员是不能改变的,这也就是所谓的设备无关性。比如说,我们要在一个客户区窗口(physical device)进行绘图,我们根本不要管这个客户区具体在哪里,又是如何显示的,我们只需把它对应的device空间作为“画布”,在这个画布上进行输出就行了,其它工作完全由Windows自动完成。

原创粉丝点击