关于SetWindowOrg和SetViewportOrg函数的说明!

关于这两个函数的解释,我就不详细叙述了,我的前两篇博客关于这两个函数的内容已经讲的比较清楚了,有需要的同学可以找一找!我只是记录一下我自己使用的心得!

微笑吐舌头先确定几点:

微笑吐舌头1.默认的时候,视口坐标原点在屏幕显示部分的左上角。

微笑吐舌头先来热一下身:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. void CmfcAppView::OnDraw(CDC* pDC)  
  2. {  
  3.     CmfcAppDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     if (!pDoc)  
  6.         return;  
  7.   
  8.     CRect rect;   
  9.     GetClientRect(&rect);  
  10.     CBrush brush(RGB(255, 0, 0));     
  11.     CPen pen(PS_SOLID, 3, RGB(0, 0, 255));    
  12.     pDC->SelectObject(&brush);  
  13.     pDC->SelectObject(&pen);  
  14.   
  15.       
  16.     pDC->SetWindowOrg(100, 100);  
  17.     pDC->SetWindowOrg(-100, -100);  
  18.     pDC->Rectangle(0, 0, 150, 150);  
  19. }  

微笑吐舌头结果是:

 

微笑吐舌头再来看一看这段: 

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. void CmfcAppView::OnDraw(CDC* pDC)  
  2. {  
  3.     CmfcAppDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     if (!pDoc)  
  6.         return;  
  7.   
  8.     CRect rect;   
  9.     GetClientRect(&rect);  
  10.   
  11.     CBrush brush(RGB(255, 0, 0));     
  12.     CPen pen(PS_SOLID, 3, RGB(0, 0, 255));    
  13.     pDC->SelectObject(&brush);  
  14.     pDC->SelectObject(&pen);  
  15.   
  16.     pDC->Rectangle(0, 0, 150, 150);    
  17.   
  18.     pDC->SetWindowOrg(-100, -100);     
  19.     pDC->Rectangle(0, 0, 150, 150);    
  20.   
  21.       
  22. }  

 微笑吐舌头结果是:

 

微笑吐舌头好吧!接下来搞点有技术含量的:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. void CmfcAppView::OnDraw(CDC* pDC)  
  2. {  
  3.     CmfcAppDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     if (!pDoc)  
  6.         return;  
  7.   
  8.     CRect rect;   
  9.     GetClientRect(&rect);  
  10.   
  11.     CBrush brush(RGB(255, 0, 0));     
  12.     CPen pen(PS_SOLID, 3, RGB(0, 0, 255));    
  13.     pDC->SelectObject(&brush);  
  14.     pDC->SelectObject(&pen);  
  15.   
  16.     pDC->SetWindowOrg(100, 100);     
  17.     pDC->Rectangle(0, 0, 150, 150);    
  18.   
  19. }  

可怜可怜结果是:

 

可怜可怜有人奇怪上面的结果了,为什么矩形只剩下大约1/4的位置了? 

可怜可怜看一下这段程序:

 

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. void CmfcAppView::OnDraw(CDC* pDC)  
  2. {  
  3.     CmfcAppDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     if (!pDoc)  
  6.         return;  
  7.   
  8.     CRect rect;   
  9.     GetClientRect(&rect);  
  10.   
  11.     CBrush brush(RGB(255, 0, 0));     
  12.     CPen pen(PS_SOLID, 3, RGB(0, 0, 255));    
  13.     pDC->SelectObject(&brush);  
  14.     pDC->SelectObject(&pen);  
  15.   
  16.     pDC->SetViewportOrg(100, 100);     
  17.     pDC->Rectangle(0, 0, 150, 150);    
  18.   
  19. }  

可怜可怜想一想结果,然后和真实的结果比对一下:

 

可怜可怜我的解释如下:

可怜可怜在看一下这段代码,然后猜一下结果?

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. void CmfcAppView::OnDraw(CDC* pDC)  
  2. {  
  3.     CmfcAppDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.     if (!pDoc)  
  6.         return;  
  7.   
  8.     CRect rect;   
  9.     GetClientRect(&rect);  
  10.   
  11.     CBrush brush(RGB(255, 0, 0));     
  12.     CPen pen(PS_SOLID, 3, RGB(0, 0, 255));    
  13.     pDC->SelectObject(&brush);  
  14.     pDC->SelectObject(&pen);  
  15.   
  16.     pDC->SetViewportOrg(100, 100);     
  17.     pDC->SetWindowOrg(-100, -100);   
  18.     pDC->Rectangle(0, 0, 150, 150);    
  19.   
  20. }  

可怜可怜让我们来核对一下:

 

可怜可怜是不是感到有些奇怪?看一下我的解释!

 

鄙视鄙视对于上面的第3步,有人感到很奇怪,为什么画矩形的时候是以变换前的逻辑坐标为准的?而不是以变换后的逻辑坐标为准的?

鄙视鄙视看一下结果的精确测量:

鄙视鄙视看见没有,测量的结果说明,我上面的原理图是正确的!

鄙视鄙视关于解释,我的解释是:SetWindowOrg函数并未实际上改变逻辑坐标,只是通知程序应该怎样映射,该把逻辑坐标的这个点映射到视口坐标的哪个点!应该比较清楚了吧?

鄙视鄙视最好,这两个函数别同时用,因为两个混在一起,很容易糊涂!

鄙视鄙视既然都讲了这么多了,顺带提一下SetViewportExt和SetWindowExt两个函数吧!这两个函数只在映射模式为MM_ISOTROPIC和MM_ANISOTROPIC下有效!两个函数里面参数的值并不重要,重要的只是他们的比值罢了!

鄙视鄙视看这段代码:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. pDC->SetMapMode(MM_ANISOTROPIC);  
  2. pDC->SetWindowExt(1024,768);  
  3. pDC->SetViewportExt(10240,7680); //表示一个窗口单位,也就是在x轴上逻辑单位对应10个视口单位,当然屏幕上表示像素,在y轴上亦然  
  4. pDC->Rectangle(0,0,100,100);  

再见再见和下面这段代码:

 

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. pDC->SetMapMode(MM_ANISOTROPIC);  
  2. pDC->SetWindowExt(10240,7680);  
  3. pDC->SetViewportExt(102400,76800);     //表示一个窗口单位,也就是在x轴上逻辑单位对应10个视口单位,当然屏幕上表示像素,在y轴上亦然  
  4. pDC->Rectangle(0,0,100,100);  

再见再见两者在效果上没有区别!

再见再见还有,两者的正负会影响坐标轴的方向!当然,这不是这篇文章的重点!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值