视口和窗口

来源:互联网 发布:怎么在淘宝上找115会员 编辑:程序博客网 时间:2024/04/29 14:31
映射方式指定了逻辑坐标系的逻辑单位和坐标轴正方向, 坐标原点没有涉及。而且, 在“自作主张的”两种映射方式下, 逻辑单位、坐标轴正方向和坐标原点都有待确定。

“视口”是基于设备坐标的, 通常, 视口与客户区相同。点( 0,0)是客户区域的左上角。x 的值向右增加, y 的值向下增加。“窗口”是基于逻辑坐标的, 逻辑坐标可以是像素、毫米、英寸等, 我们在GDI 绘图函数中指定逻辑窗口坐标。映射方式实际上是用于定义从“窗口”( 逻辑坐标) 到“视口”( 设备坐标) 的映射。在所有的映射方式下,Windows 用下面两个公式将窗口( 逻辑) 坐标转为视口( 设备) 坐标:


(xWindow,yWindow)是待转换的逻辑点, ( xViewport,yViewport)是转换后的设备坐标。视口原点(xViewOrg,yViewOrg)和窗口原点(xWinOrg,yWinOrg) 默认情况下均为( 0,0) , 可以改变; (xWinExt,yWinExt)是逻辑坐标的窗口范围; ( xViewExt,yViewExt) 是设备坐标的视口范围, 只有在MM_ISOTROPIC 和MM_ANISOTROPIC 映射方式下范围可以改变。


窗口原点和视口原点
Windows 提供了函数SetViewportOrgEx 和SetWindowOrgEx,用来改变视口和窗口的原点, 这些函数都具有改变轴的效果, 使(0,0)不再是左上角。
如果将视口原点改变为(xViewOrg,yViewOrg), 则逻辑点(0.0)就会映射为设备点(xViewOrg- xWinOrg,yViewOrg- yWinOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg), 则逻辑点(xWinOrg- xViewOrg,yWinOrg- yViewOrg)将会映射为设备点(0,0)
例如, 假设客户区为cxClient 个像素宽和cyClient 个像素高。在MM_TEXT 映射方式下, 客户区的逻辑坐标系如图1(1),如果想将逻辑点(0, 0)定义为客户区中心, 代码如下:
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;SetViewportOrgEx 的参数总是使用设备单位。默认的窗口原点(xWinOrg,yWinOrg)为( 0,0) , 逻辑点(0,0)将映射为设备点(cxClient/2,cyClient/2), 客户区的逻辑坐标系如图1(2)。


用下面的SetWindowOrgEx 语句同样可以获得如图1(2)所示的效果:
SetWindowOrgEx (hdc, - cxClient / 2, - cyClient / 2, NULL) ;
SetWindowOrgEx 的参数总是使用逻辑单位。逻辑点(- cxClient / 2,- cyClient / 2)映射为设备点(0,0), 相应的逻辑点(0,0)位于设备点(cxClient/2,cyClient/2)。

0 0
原创粉丝点击