有不对的地方十分欢迎指正,谢谢。
转载请注明出处,谢谢。
参考文献:
1、孙鑫老师《VC++深入详解》
2、作者: 刘涛 http://tech.sina.com.cn/s/2005-06-20/1143640450.shtml
3、作者:
maybe_kid
http://blog.csdn.net/maybe_kid/article/details/1749549
首先需要知道的知识点:
1、GDI函数,图像操作,画图等等几乎都是在逻辑坐标下进行。极个别有几个不是,比如GetDeviceCaps,是GDI函数,但用的设备坐标。由window完成从逻辑坐标转换为设备坐标的工作。
2、几乎所有的非GDI函数,都使用的设备坐标。另外,MFC接收到的消息,鼠标移动WM_MOUSEMOVE,鼠标点击WM_LBUTTONDOWN,还有窗口重绘WM_SIZE等等,都用的设备坐标。所以点击鼠标得到的点位置,一般需要使用DpToLp函数将其转换为逻辑坐标以后再使用。
3、不管对窗口和视口原点作什么改变,设备原点(0,0)始终是客户区的左上角。
4、设备原点(0,0)与视口原点(ViewPortOrg)不是一个概念,他俩默认是相同的,但使用SetViewPortOrg函数后,就不相同了。
一、坐标空间
页面空间可以作为图像变换的起始坐标系,也可以作为第二个坐标系(位于世界坐标系之后),主要设置映射模式。页面空间与设备空间相互配合,给应用程序提供了一种设备无关的单位,比如毫米或英尺。
概念上将世界坐标空间和页面空间称为逻辑空间。
Used as the next space after page space. It only allows translation, which ensures the origin of the device space maps to the proper location in physical device space. Device space measures 2^27 units high by 2^27 units wide.
设备空间位于页面空间之后,只用作保证设备空间的原点,映射到物理设备坐标空间中一个合适的位置(可以参考上面图)。
The final (output) space for graphics transformations. It usually refers to the client area of the application window; however, it can also include the entire desktop, a complete window (including the frame, title bar, and menu bar), or a page of printer or plotter paper, depending on the function that obtained the handle to the device context. Physical device dimensions vary according to the dimensions set by the display, printer, or plotter technology.
物理设备空间是图像变换的终点。一般指代应用程序的窗口,但它也包括整个桌面,完整的窗口(包括窗口框,标题栏,tool bar等),或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。
To depict output on a physical device, the system copies (or maps) a rectangular region from one coordinate space into the next using a transformation until the output appears in its entirety on the physical device. Mapping begins in the application's world space if the application has called the SetWorldTransform function; otherwise, mapping occurs in page space. As the system copies each point within the rectangular region from one space into another, it applies an algorithm called a transformation. A transformation alters (or transforms) the size, orientation, and shape of objects that are copied from one coordinate space into another. Although a transformation affects an object as a whole, it is applied to each point, or to each line, in the object.
以上来自msdn中 Transformation of coordinate spaces。可以看看。
补充:
设备空间到物理空间的转换只限于平移,并由Windows的窗口管理部分控制,这种转换的唯一用途是确保设备空间的原点被映射到物理设备上的适当点上。没有函数能设置这种转换,也没有函数可以获取有关数据。
页面空间 向 设备空间转换时,需要确定一种映射模式(map mode)。这种映射模式是设备相关的。它用来确定一个逻辑单位(就是世界坐标和页面坐标中的单位)与一个特定的设备的设备坐标空间中一个单位之间的对应关系。以及确定坐标系中x , y轴的方向。特定设备指打印机或显示器等。
就像上面介绍的,映射就是为了让图像与特定的设备解耦,这样我们只要图形正确,不管用什么样的设备,都能输出正确的图像。比如我在显示器上画一幅图,多少多少毫米,然后我用这个图像文件进行打印,打印出来的图像与我显示器上显示的图像完全一样。
二、”窗口“ window和 “视口” viewport
CDC dc(this); //创建DC
dc.SetViewportOrg(xViewPortOrg, yViewPortOrg); //改变视口原点为(xViewPortOrg,yViewPortOrg)
dc.Ellipse(-50, -50, 50, 50);
//画一个圆,原点位于(0,0)
在显示器上显示出来的是设备空间的样子,上面画圆的代码中,没有对窗口原点进行改动,所以可以看到页面空间原点与窗口原点同为一点。而语句dc.SetViewPortOrg(xViewPortOrg,yViewPortOrg)将视口原点改为了(xViewPortOrg,yViewPortOrg)。即告诉系统,我现在画在页面空间的这个以 页面空间坐标系(0,0)点为圆心的圆,你要显示到设备空间坐标下 设备空间坐标系的 (xViewPortOrg,yViewPortOrg)点处。