特别篇-SetWindowExtEx,SetViewportExtEx解析


窗口坐标和视口坐标的转换公式:


  



例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,这真的好奇怪啊,但是事实就是如此,和各向异性的情况下不同,切记!!!


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值