窗口、视口、屏幕显示详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
窗口、视口、屏幕显示详解--计算机绘图基本功窗口:逻辑环境中的一小部分,是一个矩形框;世界坐标系是逻辑坐标,SetWindowOrg(X,Y)设置窗口的逻辑坐标点(X,Y)映射为的设备环境的设备点(0,0)。
设备环境:显示器、打印机等等。坐标系为设备坐标系,正Y轴向下,正X轴向右,原点在左上角,固定不变,不可修改!其X、Y的负半轴为虚设,无法显示或无法打印图形。
视口:设备环境中的一部分,一个矩形框;坐标系同设备环境。SetViewportOrg(X,Y)设置视口矩形框的坐标原点,默认值为设备坐标原点。视口是窗口的按比例的映像(投影)。
1.窗口和视口以及设备环境出现的缘起
窗口和视口实际上描述的是同一个客观场景,它们之间的区别仅仅在于两者坐标系的单位不同。设备环境就是显示设备。窗口和视口中的场景必须通过映射模式正确的显示到设备环境中。默认情况下,Windows GDI绘图中的窗口坐标原点、视口坐标原点以及设备点重合在一起都是在设备点(0,0)处。Windows GDI的设备环境原点是位于屏幕的左上角,设备点始终位于(0,0)点,x轴向右,y轴向上;OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。OpengL默认世界窗口坐标原点位于屏幕中心,x轴向右,y轴向上。视口原点在屏幕左下角。
视口与窗口表征的是同一个实际几何物体,所以有窗口必定有视口,有视口必定有窗口。窗口或视口可以理解为用眼睛看到的物体实体,例如一个球,设备环境显示区域(显示屏)可以理解为由于计算机屏幕长宽比不同,实际物体在计算机屏幕上看到的最终显示结果,例如显示屏中的球看起来变成一个椭球。几乎在所有的GDI函数中使用的坐标值都是采用的逻辑单位,也就是物体实际多大就是多大。Windows 必须将逻辑单位转换为“设备单位”---像素,也就是物体在设备环境
(显示屏或打印机)显示后看起来应该多大。这种转换是由映射方式、窗口和视口的原点以及窗口和视口的范围所控制的。通过不同的映射方式可以在逻辑单位下改变窗口原点的位置而将物体现实在设备环境中,也可以在以像素为单位的视口坐标系下移动视口将物体显示在显示屏上,不管对窗口和视口原点作什么改变,设备点(0,0)始终是客户区的左上角,两者都是为了让物体在显示屏上现实。调整窗口原点和调整视口原点可以达到相同的效果。
视口是与设备相关的一个矩形区域,坐标单位是与设备相关的,直观的视口原点坐标的移动就是dc的移动。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐标的原点始终对应于同一点。对于同一个图形,用窗口坐标系统表达的该区域的长和宽与视口的坐标系统表达的长和宽是不同的,因单位不同。二者就定义了这两个坐标系统的比例关系。程序作图时,使用的坐标总是是窗口坐标,而实际的显示或输出设备却各有自己的坐标。例如,有的打印机设备水平和垂直分辨率不同,其象素实际上是长方形。程序编写画一个圆,若不经任何坐标转换,在打印机上输出的就是个椭圆。
在MFC中ONDRAW之前已经调用了ONPREPAREDC函数为你做好映射模式。默认情况下,其映射模式为MM_TEXT模式,即1:1模式。要改变默认映射模式应重载OnPrepareDC重新设置自己的映射模式。为了提高绘图精度,经常需要改变映射模式。
2.窗口和视口理解要点
窗口与视口一向是初学者比较难以理解的难点,本人以前也是糊里糊涂的,不过最近有时间去深入研究之后,才彻底弄明白,摆脱了以前很多错误的观念。弄清楚了这些才会更好的使用不同的坐标影射模式,更灵活的为自己的绘图带来便利:
首先要清楚窗口和视口的坐标原点始终是同一个点,窗口和视口中的内容是同样的内容。设备坐标(显示器)中则会根据视口或窗口原点的改变而显示出不同的内容。在MM_TEXT映射模式下世界坐标系第三象限的内容就是窗口坐标系下第一象限的内容,所以有SetViewportOrg(x,y)与SetWindowOrg(-x,-y)具有相同的效果。这个很难理解但是这是事实。“设备环境”如显示屏始终是只有左手坐标系xoy第一象限的区域。开始时窗口坐标原点、视口坐标原点以及设备点重合在一起都是在客户区的左上角,为了将物体显示在显示屏上,通过SetWindowOrg(x,y)将"画布"(世界坐标系原点)向屏幕的左边移动x
个单位,向屏幕的上方移动y个单位。SetViewportOrg(x,y)是将"画笔"(视口原点)向屏幕的右边移动x个单位,向屏幕的下方移动y个单位。
现将其关键点归纳如下:
1、视口与显示设备有关,视口等同客户区,使用设备坐标。视口是和窗口等同的一块矩形区域,它的x轴向右和y轴向下。
2、窗口与显示设备无关,窗口与视口为同一区域,但使用
逻辑坐标,它的x轴向右,y轴向上。
3、窗口与视口使用不同的坐标系,但是两套坐标系的原点
始终为同一点。但该点坐标(不管是视口坐标原点还是窗口坐标原点)
不一定为(0,0)。窗口就是视口,去吧仅仅在于两者建立的坐标系不同,移动窗口的同时就是移动视口,反之亦然。
4、视口原点的位置(就是画笔dc的初始位置)仅仅由SetViewportOrgEx(x,y)函数来移动。(x,y)是相对于客户区左上角的设备坐标,即像素),而SetWindowOrg(X,Y)设置窗口的逻辑坐标点(X,Y)映射为的设备环境的设备点(0,0)
It's easy to get SetViewportOrg and SetWindowOrg confused,but the distinction between them is actually quite clear.Changing the viewport origin to(x,y) with SetViewportOrg tells Windows to map the logical point(0,0)to the device point(x,y).Changing the window origin to(x,y)with SetWindowOrg does essentia lly the reverse,telling Windows to map the logical point(x,y)to the device point(0,0)—
the upper left corner of the display surface.In the MM_TEXT mapping mode,the only real difference betwe en the two functions is the signs of x and y.In other mapping modes,there's more to it than that be cause SetViewportOrg deals in device coordinates and S etWindowOrg deals in logical coordinates.<