窗口与视口深入理解
2010-06-10 15:43
162 查看
窗口与视口一向是初学者比较难以理解的难点,本人以前也是糊里糊涂的,不过最近有时间去深入研究之后,才彻底弄明白,摆脱了以前很多错误的观念。弄清楚了这些才会更好的使用不同的坐标影射模式,更灵活的为自己的绘图带来便利:
现将其关键点归纳如下:
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
现将其关键点归纳如下:
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
相关文章推荐
- 窗口与视口深入理解
- 彻底理解窗口,视口,以及SDI各种映射模式
- Qt二维图形编程之窗口-视口概念理解
- 视口和窗口的理解方法
- 理解 视口 概念 视 看得见的设备窗口
- 读《深入理解Windows Phone 8.1 UI控件编程》1.4.3 框架的应用示例:自定义弹出窗口有感
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
- 深入理解Java内存模型系列(二)——重排序
- 深入理解MVC
- 深入理解AngularJs-Ui-router
- Qt深入理解信号与槽
- 深入理解const
- 深入理解Volatile,synchronized,原子操作的必要性
- 深入理解Java的接口和抽象类
- (C/C++学习笔记)临时对象深入理解
- 读后感--第二章android源码下载及编译--深入理解android内核设计思想
- javascript深入理解js闭包
- 深入理解Oracle索引(13):位图连接索引基础介绍
- javascript 函数重载(深入理解)
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系