GDI编程
来源:百度文库 编辑:神马文学网 时间:2024/06/05 08:31:06
窗口与视口一向是初学者比较难以理解的难点,本人以前也是糊里糊涂的,不过最近有时间去深入研究之后,才彻底弄明白,摆脱了以前很多错误的观念。弄清楚了这些才会更好的使用不同的坐标影射模式,更灵活的为自己的绘图带来便利:
现将其关键点归纳如下:
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、窗口原点和零点均可任意移动。
不正确之处,欢迎各位高手指正!
现将其关键点归纳如下:
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、窗口原点和零点均可任意移动。
不正确之处,欢迎各位高手指正!
GDI编程
GDI编程1
GDI编程2
GDI 编程基础(一)GDI Vs GDI
一些关于GDI+的文字——编程模式的变化
GDI+ 和 GDI比较
什么是GDI+ ?
GDI+显示GIF动画
GDI+ SDK参考
氦版GDI++使用说明
GDI DC通俗解释
GDI(图形设备接口)
GDI(图形设备接口)
在非托管C++中使用GDI+
Davidwu : GDI SDK参考 - (翻译) [3]
在非托管C++中使用GDI
GDI .ini的完美漂亮配置
胡子GDI++.INI配置文件(氦版)
打印机GDI/PS/PCL驱动特点及区别-打印机 GDI PS PCL 驱动 区别-驱动之...
一些关于GDI+的文字——新增功能
一些关于GDI+的文字——图形容器
GDI+中GIF图片的显示(一)
GDI+中GIF图片的显示(二)
GDI+中GIF图片的显示(三)