关于SetWindowOrg和SetViewportOrg函数的说明!

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

    先确定几点:

     1.默认的时候,视口座标原点在屏幕显示部分的左上角。

    先来热一下身:

  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.     *     通常这个SetViewportOrg函数调用多次实际上就只有最后的一次起效果!如同下面的语句。 
  17.     *     pDC->SetWindowOrg(100, 100),这句有或者没有都不影响结果! 
  18.     *     我是这样理解的,程序里记录着一张逻辑座标表.第一次时,逻辑座标系原点被移至(100, 100)这个点! 
  19.     *当然,这个点是相对于程序记录的那个逻辑座标系为准的。第二次时,逻辑座标系被移至原点(-100, -100) 
  20.     *这个点,这个点也是相对于程序记录的那个逻辑座标系而言的。我们看到,第一次等于没做。 
  21.     *     (每次调用SetWindowOrg都以这张逻辑座标为准!) 
  22.     */  
  23.     pDC->SetWindowOrg(100, 100);  
  24.     pDC->SetWindowOrg(-100, -100);  
  25.     pDC->Rectangle(0, 0, 150, 150);  
  26. }  
     结果是:


     

       再来看一看这段: 

  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);   /*将逻辑座标系原点移至(-100, -100),相对于原来的那个逻辑座标系而言*/  
  19.     pDC->Rectangle(0, 0, 150, 150);  /*再画一个矩形*/  
  20.   
  21.     /* 
  22.     *   看了结果,有人很疑惑,怎么上面那个矩形没有随着逻辑座标一起移动? 
  23.     *   整个程序的客户区你可以看做是一块画布啦!怎么会有已经画好的东西,还可以移动的道理,你说算是吧? 
  24.     * 
  25.     */  
  26. }  
    结果是:


   好吧!接下来搞点有技术含量的:

  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);   /*将逻辑座标系原点移至(-100, -100),相对于原来的那个逻辑座标系而言*/  
  17.     pDC->Rectangle(0, 0, 150, 150);  /*再画一个矩形*/  
  18.   
  19. }  

     结果是:

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


     看一下这段程序:

  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);   /*将视口座标系原点移至(-100, -100),相对于原来的那个视口座标系而言*/  
  17.     pDC->Rectangle(0, 0, 150, 150);  /*画一个矩形*/  
  18.   
  19. }  
        想一想结果,然后和真实的结果比对一下:


    我的解释如下:


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

  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);   /*将视口座标系原点移至(100, 100),相对于原来的那个视口座标系而言*/  
  17.     pDC->SetWindowOrg(-100, -100); /*将逻辑(窗口)座标系原点移至(100, 100),相对于原来的那个逻辑座标系而言*/  
  18.     pDC->Rectangle(0, 0, 150, 150);  /*画一个矩形*/  
  19.   
  20. }  
     让我们来核对一下:


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

 

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

     看一下结果的精确测量:



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

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

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

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

    看这段代码:

  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);  
          和下面这段代码:

  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);  
        两者在效果上没有区别!

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


本文转载自:

http://blog.csdn.net/lishuhuakai/article/details/18467255

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章