一、坐标空间
1、Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转,斜切或者反射。
2、Win32 API把世界坐标系空间和页面空间称为逻辑空间,最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区。但是它也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。
 
二、转换
1、如要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上(通常是屏幕或打印机)。
2、如果该应用程序调用了SetWorldTransform函数,那么映射就从应用程序的世界坐标系空间开始。否则,映射在页面空间中进行.在Windows把矩形区域的每一点从一个空间拷贝到另一个空间,它采用了一种被称作转换的算法,转换是把对象从一个坐标系空间拷贝到另一个坐标系空间时改变(或转变)这一对象的大小、方位、和形态。尽管转换把对象看成一个整体,但它也作用于对象中的每一点或每一条线。
下面是运用SetWorldTransform函数而进行的一个典型转换
 
三、页面空间到设备空间的转换
1、页面空间到设备空间的转换是原Windows接口的一部分,这种转换确定与一特定设备描述表相关的所有图形输出的映射方式。
2、所谓映射方式是指确定用于绘图操作的单位大小的一种量度转换。映射方式是一种影响几乎任何客户区绘图的设备环境属性。另外还有四种设备环境属性:窗口原点、视口原点、窗口范围和视口范围,这四种属性与映射方式密切相关。
3、页面空间到设备空间的转换所用的是两个矩形的宽与高的比率(称为转换因子),其中页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口。Windows把窗口原点映射到视口原点,把窗口范围映射到视口范围,就完成了这种转换。如下图所示:
 
 
四、设备空间到物理空间转换
1、设备空间到物理空间的转换有几个独特之处:它只限于平移,并由Windows的窗口管理部分控制。这种转换的唯一用途是确保设备空间的原点被映射到时物理设备上的适当点上。没有函数能设置这种转换,也没有函数可以获取有关数据。
 
五、默认转换
1、一旦应用程序建立了设备描述表,并立即开始调用GDI绘图或输出函数,则运用默认页面空间到设备空间的转换和设备空间到时客户区的转换(在应用程序调用
SetWorldTransform函数之前,不会出现世界坐标空间到页面空间的转换)
2、默认页面空间到设备空间的转换结果是一对一的映射,即页面空间上给出的一点映射到设备空间的一个点。这种转换没有以矩阵指定,而是通过把视口宽除以窗口宽,把视口高除以窗口高而得到的。在默认的情况下,视口尺寸为1x1个象素,窗口尺寸为1x1页单位。
3、设备空间到时物理设备(客户区、桌面或打印机)的转换结果总是一对一的。即设备空间的一个单位总是与客户区、桌面、或打印机上的一个单位相对应。这一转换的唯一用途是平移。无论窗口移到桌面的什么位置,它永远确保输出能够正确无误地出现在窗口上。
4、默认转换的一个独特之处是设备空间的应用程序窗口的y轴方向。在默认的状态
下,y轴正向朝下,负y方向朝下。
 
六、逻辑坐标与设备坐标
1、几乎所有的GDI函数中使用的坐标值都是采用的逻辑单位,Windows必须将逻辑单位转换为"设备单位",即像素。这种转换是由映射方式,窗口和视口的原点以及窗口和视口的范围所控制的。
2、Windows对所有的消息(如WM_SIZE,WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP),所有的非GDI函数和一些GDI函数(例如GetDeviceCaps函数),永远使用设备坐标。
3、"窗口"是基于逻辑坐标的,逻辑坐标可以是象素、毫米、英寸等单位;"视口"是基于设备坐标(象素)的。通常,视口和客户区是相同的。
4、缺省的映射模式为MM_TEXT。在这种映射模式下,逻辑单位和设备单位相同。
 
七、逻辑坐标和设备坐标的相互转换
1、窗口(逻辑)坐标转换为视口(设备)坐标的两个公式:
2、视口(设备)坐标转换为窗口(逻辑)坐标的两个公式:
 
八、在MM_TEXT映射方式下逻辑坐标和设备坐标的相互转换
1、窗口(逻辑)坐标转换为视口(设备)坐标的两个公式:
2、视口(设备)坐标转换为窗口(逻辑)坐标的两个公式:
 
九、视口和窗口原点的改变
1、CDC中提供了两个成员函数SetViewportOrg和SetWindowOrg,用来改变视口和窗口的原点。
2、如果将视口原点设置为(xViewOrg,yViewOrg),则逻辑点(0,0)被映射为设备点
(xviewOrg,yViewOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点
(xWinOrg,yWinOrg)将会被映射为设备点(0,0),即左上角。
3、不管对窗口和视口原点作什么改变,设备点(0,0)始终是客户区的左上角。
 
 
注:以上资料及图片是根据孙鑫老师VC++视频教程而作的笔记,所有权归孙鑫老师所有,转载请注明所有权!