特别篇-SetWindowExtEx,SetViewportExtEx解析
来源:互联网 发布:矩阵控制系统 编辑:程序博客网 时间:2024/05/02 02:34
窗口坐标和视口坐标的转换公式:
例1:
//各向异性,表示windows不对窗口和视口做出调整,即x轴和y轴并不总是保持相同的逻辑单位, SetMapMode(hdc,MM_ANISOTROPIC); //设置窗口的范围300 X 300, SetWindowExtEx(hdc,300,300,NULL); //设置视口范围,一般设置为客户区的长宽,xy轴的坐标向右向下递增 //SetViewportExtEx(hdc,rectClient.right,rectClient.bottom,NULL); SetViewportExtEx(hdc,rectClient.right,-rectClient.bottom,NULL); //设置视口原点为客户区中心 SetViewportOrgEx(hdc,rectClient.right / 2,rectClient.bottom / 2,NULL); Ellipse(hdc,-100,-100,100,100); MoveToEx(hdc,-50,0,NULL); LineTo(hdc,50,0); MoveToEx(hdc,0,-150,NULL); LineTo(hdc,0,150); MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100);
x逻辑单位长:rectClient.right/300
y逻辑单位长:rectClient.bottom/300
由图可知,客户区的长宽并不相等,所以xy的单位长也不相等,也就造成的了椭圆的形成。
当客户区的长宽相等时,xy的逻辑单位长一样,椭圆就成了圆。
设置视口范围为客户区长宽,但xy轴分别向右向上递增
SetViewportExtEx(hdc,rectClient.right,-rectClient.bottom,NULL);
效果图:
为什么设置视口范围,一般设置为客户区大小?
这是为了显示大方,因为此时整个客户区恰好都得到了利用。
那如果不是设置为客户区大小呢?
设定视口范围的作用,个人觉得是调节可视化比例的。 k=实际内容 / 显示的内容
如果视口范围小于客户区,k < 1, 那么用户从客户区的角度去看,就能看到窗口中更多的内容,更让人惊讶的是窗口原来的可操作范围也变大了,这个范围我还没确定,暂时不深究了。同理,如果视口范围大于客户区,k > 1, 从客户区的角度看窗口的内容就变少了。
用户只能从客户区的角度看窗口内容。
SetMapMode(hdc,MM_ANISOTROPIC); SetWindowExtEx(hdc,300,300,NULL); SetViewportExtEx(hdc,rectClient.right/2,rectClient.bottom/2,NULL); SetViewportOrgEx(hdc,rectClient.right / 2,rectClient.bottom / 2,NULL); Ellipse(hdc,-100,-100,100,100); MoveToEx(hdc,-50,0,NULL); LineTo(hdc,50,0); MoveToEx(hdc,0,-200,NULL); LineTo(hdc,0,150); MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100); MoveToEx(hdc,0,0,NULL); LineTo(hdc,50,-150);
效果:
小结:在各向异性的情况下,窗口范围设定想操作的范围,例如参数为100,,200,那么在坐标系中范围为-50~50,-100~100,视口范围建议设为客户区大小,这会极大的方便操作,不然在窗口已设定的范围内竟然可以操作越界的坐标(当视口范围小于客户区大小时),会很莫名奇妙的。当然还可以通过正负号更改象限,默认第一象限在右下角,例如你想更改成笛卡尔坐标时,SetViewportExtEx(hwnd,cxClient,-cyClient,NULL);
示例2:
//各向同性,xy轴上单位长度一样 SetMapMode(hdc,MM_ISOTROPIC); //设置窗口范围 300 X 300 SetWindowExtEx(hdc,300,300,NULL); //设置视口范围为客户区大小,最佳的显示效果(建议) SetViewportExtEx(hdc,rectClient.right,rectClient.bottom,NULL); SetViewportOrgEx(hdc,rectClient.right / 2,rectClient.bottom / 2,NULL); Ellipse(hdc,-100,-100,100,100); MoveToEx(hdc,-50,0,NULL); LineTo(hdc,50,0); MoveToEx(hdc,0,-150,NULL); LineTo(hdc,0,150); MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100); MoveToEx(hdc,0,0,NULL); LineTo(hdc,50,-100); MoveToEx(hdc,0,0,NULL); LineTo(hdc,200,-150);
效果图:
小结:在各向同性的情况下,xy轴的单位长度是一样的,设置的视口大小时,如参数为300,300,那么表示x轴的范围为-300~300,y轴范围为-150~150,这真的好奇怪啊,但是事实就是如此,和各向异性的情况下不同,切记!!!
- 特别篇-SetWindowExtEx,SetViewportExtEx解析
- GDI 映像方式 之 SetViewportExtEx 与 SetWindowExtEx 解析
- GDI 映像方式 之 SetViewportExtEx 与 SetWindowExtEx 解析
- SetWindowExtEx()与SetViewportExtEx()
- 关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解
- 关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解
- 关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解 .
- Windows 程序设计 SetWindowExtEx SetViewportExtEx SetWindowOrgEx SetViewportOrgEx
- SetWindowExtEx函数、SetViewportExtEx函数和SetWindowOrgEx函数
- 关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解
- 对SetWindowExtEx、SetViewportExtEx调用的理解
- 关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解
- windows编程中关于设置映象模式的四个函数SetWindowOrg SetViewPortOrg SetMapMode SetWindowExtEx SetViewPortExtEx
- 对windows区域(Region)的操作,不受SetWindowExtEx和SetViewportExtEx的影响
- 关于MM_ANISOTROPIC映射模式, 利用SetWindowExtEx和SetViewportExtEx函数设置Y轴方向的问题
- windows编程中关于设置映象模式的四个函数SetWindowOrg SetViewPortOrg SetMapMode SetWindowExtEx SetViewPortExtEx .
- SetWindowExtEx
- 理解SetWindowExtEx
- UVa 10003 - Cutting Sticks(区间DP+记忆化)
- Mybatis封装分页查询的java公用类
- HDU3853
- POJ 2251 Dungeon Master
- Code Forces 55 D. Beautiful numbers(数位DP)
- 特别篇-SetWindowExtEx,SetViewportExtEx解析
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL
- Unity3d如何读写XML文件
- XUtils数据库的简单使用;
- 类的扩展
- Android开发时经常用的LogUtil
- uva 11045 My T-shirt suits me (二分图匹配 最大流)
- ios下inhouse发布相关代码
- [黑马程序员](第10-15天)集合类(下)