关于窗口与视口的总结
绘图操作只能在客户区中进行。除客户区以外的部分都叫非客户区
在 Windows 的 作 图 函 数中 , 涉 及 逻 辑 坐 标 到 设 备 坐 标 的 转 换 。 这 里 提 到 的 窗 口
(window)、视口 (viewport)是对应的概念。视口是与设备相关 的一个矩形区域,坐
标单位是与设备相关的。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐
标的原点始终对应于同一点。,窗口原点是与视口原点相同的,(也就是说,位于屏幕上
的同一个位置),为了体会不窗口坐标与视口坐标的转换,先用 SetwindowtOrg(100, -
300)将视口移到(100,-300),这相当于把 逻辑点(100,-300)映射到设备点(0,0) (注
意:如果改用 SetviewportOrg 移动原点,则其原点的移动尺寸与映射模式无关,其 300
个长度单位等于 9 厘米)
(注:这个设备点也是相对于当前的 DC 而言,如果当前的 DC 是整个屏幕,那么设备点
(100,-300)的原点就在屏幕的左上角,如果当前的 DC 是某个应用程序的客户区,那
么设备点(100,-300)的原点就是应用程序的客户区的左上角,)
现在假设当前 DC 是某个应用程序的客户区,映射模式为 MM_LOMETRIC
(在这种映射模式下,设备坐标以 0.1 毫米为一个长度单位,Y 轴的正方向为向上,也就是
说,屏幕上的左上角的 Y 坐标为 0,下面的 Y 坐标均小于 0),当使用语句:
MoveTo(100,-600);
LineTo(100,-800);//Y 轴负方向向下,所以用负值
进行画图时,它的转换过程如下:
1)窗口与视口坐标转换,由于窗口坐标(100,-300 ),映射为设备坐标(0,0),所 以
窗口(100,-600)映射为视口(0,-300)
窗口(100,-800)视映射为视口(0,-500)
2)逻辑与设备坐标转换
由于是 MM_LOMETRIC 映射模式,设备坐标的单位长度为 0.1mm,而在输出时用的是
视口坐标,所以视口坐标(100,-600)输出到屏幕上时,该点的位置
距客户区左边 0 厘米,距客户区上边 3 厘米。这就是直线的起点;
再把直线终点的视口坐标(100,-800)输出到距客户区左边 0 厘米,距客户区上边 5 厘
米处。对于同一个图形,用窗口 坐标系统表达的该区域的长和宽与视口的坐标系统表达的
长和宽是不同的。二者就定义了这两个坐标系统的比例关系。程序作图时,使用的坐标总
是是窗口坐标。而 实际的显示或输出设备却各有自己的坐标。例如,有的打印机设备水平
和垂直分辨率不同,其象素实际上是长方形。程序编写画一个圆,若不经任何坐标转换,
在打 印机上输出的就是个椭圆。下面程序示范了如何将窗口逻辑坐标的 x,y 向象素宽度均
映射为输出设备中的 1/64 英寸。
[code]
SetMapMode(hDC, MM_ISOTROPIC);
SetWindowExtEx(hDC, 64, 64, NULL);
SetViewportExtEx(hDC, GetDeviceCaps(hDC, LOGPIXELSX),