窗口与视口深入理解

来源:互联网 发布:逆战刷枪软件不封号? 编辑:程序博客网 时间:2024/05/21 19:32

窗口与视口一向是初学者比较难以理解的难点,本人以前也是糊里糊涂的,不过最近有时间去深入研究之后,才彻底弄明白,摆脱了以前很多错误的观念。弄清楚了这些才会更好的使用不同的坐标影射模式,更灵活的为自己的绘图带来便利:

现将其关键点归纳如下:

1、 视口等同客户区,使用设备坐标。

2、 窗口与视口为同一区域,但使用逻辑坐标。

3、 窗口与视口使用不同的坐标系,但是两套坐标系的原点始终为同一点。但该点坐标(不管是视口坐标原点还是窗口坐标原点)不一定为(0,0)。
4、 坐标点的位置(相对于客户区左上角)仅仅由SetViewportOrgEx (x,y) 函数来移动(x,y相对于客户区左上角的设备坐标,即像素),而SetWindowOrgEx(x,y)仅仅设置该原点作为窗口坐标原点时所对应的逻辑坐标为(x,y),而不会改变其相对于客户区左上角的位置。
5、 理解窗口与视口的坐标转换公式:
       Xviewport=(Xwindow-Xwinorg)* Xviewext / Xwinext + Xvieworg;
       Yviewport=(Ywindow-Xwinorg)* Yviewext / Ywinext + Yvieworg;
       此公式初看上去不好理解,变形如下:
       (Xviewport-Xvieworg)/(Xwindow-Xwinorg)= Xviewext / Xwinext;
       (Yviewport-Yvieworg)/(Ywindow-Xwinorg)= Yviewext / Ywinext;
        如此就很好理解了:基于上述1、2、3点,在这个区域的任意一点到原点的距离之比,就是其逻辑坐标单位与设备坐标单位的比,即比例因子。   
6、 对于定义的客户区域大于程序所创建的窗口时,就需要有滚动条来滚动显示,才能显示完整的客户区域。
7、 处理滚动窗口:假设未滚动窗口时,客户区左上角对应窗口和视口的原点坐标,且默认均为(0,0), 如果滚动窗口时,水平方向向右滚动了X个像素,垂直方向向下滚动了Y个像素,则应该认为客户区域的左上角为窗口原点(同时也是视口原点)一起滚动,并且窗口原点的坐标始终为(0,0)不变,但是视口的原点所影射的坐标应该发生变化,且为(-X,-Y)。可以通过SetViewportOrgEx (-X,-Y)。通过调试MFC中CSrollView类函数,发现,它就是通过SetViewportOrgEx (X,Y)函数改变视口的坐标原点来实现窗口的滚动。
8、  坐标原点(不论是视口还是窗口)不等于坐标零点(必需明白)。
9、视口的坐标原点可以任意移动,但其零点始终在客户区左上角。
10、窗口原点和零点均可任意移动。
不正确之处,欢迎各位高手指正!
注:转自http://blog.csdn.net/Benkong2008/archive/2008/04/21/2313009.aspx

原创粉丝点击