坐标系:
Win32应用程序设计接口(API)使用四种坐标系空间:世界坐标系空间,页面空间,设备空间和物理设备空间。前两种是逻辑空间。
物理设备空间即为我们经常使用的坐标系,使用GetWindowDC获取整个窗口,包括框架,标题栏,菜单栏等;使用GetClientDC获取窗口的客户区。
转换:
如果要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标系空间拷贝到另一个坐标空间,直至最终完整的输出到物理设备上(通常是屏幕或打印机)。
如果使用了SetWorldTransform函数,那么映射就从应用程序的世界坐标系空间开始,否则,映射在页面空间中进行。
映射:世界坐标空间(如果调用SetWorldTransform)->页面空间->设备空间->物理设备空间。
典型转换:(一个典型的矩形转换),在设备空间中,原点为屏幕的左上角,向右为X轴,向下为Y轴。
转换主要是确定从一个坐标系中的一个点映射到另一个坐标系空间的点的映射方式。
映射方式是指确定用于绘图操作的单位大小的一种量度转换,映射方式是一种影响几乎任何客户区绘图的设备环境属性。另外还有四种设备环境属性:窗口原点,视图原点,窗口范围和视口范围。这四种属性和映射方式密切相关。
页面空间到设备空间的转换:
页面空间到设备空间的转换所用的是两个矩形的宽与高的比率,其中页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口,Windows把窗口原点映射到视口原点,把窗口范围映射到视口范围,就完成了这种转换。
设备空间到物理空间的转换只限于平移,这种转换是Windows完成的,与程序无关。
默认页面转换到设备空间的转换是一对一映射,默认,视口尺寸是1*1个像素,窗口尺寸为1*1个页单位。
几乎所有的GDI函数中使用的坐标值都采用的是逻辑单位,Windows必须将逻辑单位转换为设备单位,即像素。这种转换必须由映射方式、窗口和视口原点,窗口和视口范围控制。
Windows对所有的消息(如WM_SIZE消息等),所有的非GDI函数和一些GDI函数(如GetDeviceCaps函数),永远使用设备坐标。
窗口是基于逻辑坐标的,逻辑坐标可以使像素,毫米,英寸等单位;视口是基于设备坐标的,即像素,通常视口和客户区是相同的。
缺省的映射方式是MM_TEXT,这种映射模式下,逻辑单位和设备单位是相同的。
不管对窗口和视口的原点做什么改变,设备点(0,0)始终在客户区的左上角。
OnPrepareDC会随时根据滚动窗口的位置来调整视口的原点。
CMetaFileDC重要:
用于支持窗口重绘,在窗口上进行作图后,用此类对象保存,然后重新展示,详见MSDN。
还可以用兼容DC来保存在窗口上的绘画:将窗口的东西保存到兼容DC上,在重绘的时候从兼容DC上拷贝到目的DC上。