VC中坐标系的建立

来源:互联网 发布:淘宝虚拟店铺入驻 编辑:程序博客网 时间:2024/05/01 15:56
(一) 建立以左上角为原点,X轴和Y轴为1000的坐标
  我们可以用以下代码:

  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(0,0);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,1000);

    pDC->MoveTo(50,50);
    pDC->LineTo(50,950);
    pDC->LineTo(950,950);
    pDC->LineTo(50,50);
   }

  代码分析:

  1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中

  2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式

  3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点

  4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和

   pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系

  5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同

  6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。

  7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。

  (二) 建立以视窗中心为原点的坐标
  用如下代码:

  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,-1000);

    pDC->MoveTo(150,150);
    pDC->LineTo(-150,-200);
    pDC->LineTo(150,-150);
    pDC->LineTo(150,150);
   }

  代码分析:

  1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。

  2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。

  3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。
 
原创粉丝点击