视口是在 Windows的作图函数中,涉及逻辑坐标到设备坐标的转换。这里提到的窗口(window)、视口(viewport)是对应的概念。视口是与设备相关的一个矩形区域,坐标单位是与设备相关的“像素”,大多数情况下,视口与客户区相同。窗口的坐标是逻辑坐标,与设备无关,可能是像素、毫米或者英寸。窗口坐标的原点与视口坐标的原点始终对应于同一点。对于同一个图形,用窗口坐标系统表达的该区域的长和宽与视口的坐标系统表达的长和宽是不同的。二者就定义了这两个坐标系统的比例关系。程序作图时,使用的坐标总是是窗口坐标。而实际的显示或
输出设备却各有自己的坐标。
客户区
绘图操作只能在客户区中进行。除客户区以外的部分都叫非客户区。例如,有的
打印机设备水平和垂直分辨率不同,其像素实际上是长方形。程序编写画一个圆,若不经任何
坐标转换,在打印机上输出的就是个椭圆。下面程序示范了如何将窗口逻辑坐标的x,y向像素宽度均映射为
输出设备中的 1/64 英寸。
代码
[code]
SetMapMode(hDC, MM_ISOTROPIC);
SetWindowExt(hDC, 64, 64, NULL);
SetViewportExt(hDC, GetDeviceCapshDC, LOGPIXELSX),
GetDeviceCaps(hDC, LOGPIXELSY), NULL;
[/code]
代码解释
调用
SetWindowExt()函数后,紧接着应调用
SetViewportExt()函数,它的任务是规定水平及垂直
坐标轴的单位。可以这样认为,SetWindowExt()函数对应着“窗口”,SetViewportExt()函数对应着“视口”。几点:
1.窗口是基于逻辑坐标的.
2.视口是基于设备坐标.
3.设备坐标是以像素为单位的,逻辑坐标是以.cm,m,mm,.....
4.系统最后一定要把逻辑坐标变为设备坐标.
5.设备坐标有3种:
a.GetDC() 客户区坐标.
b.GetWindowDC().窗口坐标.
c.GetDC(NULL),or CreateDC() .屏幕坐标.
问题示例
问题如下:
(1):pDC->
SetMapMode(MM_ISOTROPIC);
(2):pDC->
SetWindowExt(4000,3000);
(4):pDC->
SetViewportExt(cRect.Width(),-cRect.Height()/2);
(6):pDC->
SetWindowOrg(-(cRect.Width()/2),-(cRect.Height()/2));
...
示例解释
第二句:设置与
设备上下文关联的窗口的X和Y坐标的范围。其中4000和3000是逻辑坐标。此时窗口大小为(4000,3000),视口大小未知。
第三句:得到客户区尺寸。此尺寸就是当前视口尺寸。如果(800,600),在最大化时此尺寸为(800,600).
第四句:设置视口的范围,第二个参数为负数,表示视口坐标往下移了
cRect高度的一半。
第五句:将设备
坐标转换成逻辑坐标。因为
GetClientRect得到的设备坐标
第六句:设置设备上下文窗口的起始坐标。
第七句:在第六句的基础上,在逻辑坐标位置输出文本abc.
两个原则:
1.总是由窗口原点映射为视口原点。即无论窗口的原点和视口的原点怎么变,窗口的原点总是映射到视口的原点。(记住:映射方向是窗口到视口,而不是视口向窗口映射)
2.不管利用函数(如:SetViewportOrgExt和
SetWindowOrgEx)对窗口和视口的原点做怎么改变,设备点(0,0)始终是客户区的左上角。