对SetViewportOrg和SetWindowOrg的理解

对SetViewportOrg和SetWindowOrg的理解:
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 CRect rect;
 GetClientRect(&rect);
 CClientDC dc(this);
 dc.SetViewportOrg (0, rect.Height());   //把原点移至视口的左下角
 dc.Rectangle (0,0,200,-200);

 dc.SetViewportOrg(rect.Width(), rect.Height()); //把原点移至视口的右下角
 dc.Rectangle(0,0,-200,-200);

 dc.SetViewportOrg(rect.Width(),0);    //把原点移至视口的右上角
 dc.Rectangle(0,0,-200,200);

 dc.SetViewportOrg(0,0);       //移回原来的位置
 dc.Rectangle(0,0,200,200);

 CScrollView::OnLButtonDown(nFlags, point);
}
     由于SetViewportOrg的参数是设备坐标,与逻辑坐标无关,所以当它移动坐标轴时与上一次的坐标轴的位置无关的,并且GetClientDC获得的是设备坐标,更加可以相信它每一次设置的坐标的正确性,它的主要作用是:将原点(左上角)移至参数指定的点.


    至于SetWindowOrg是采用逻辑坐标进行设置坐标原点的,它可以在对应的逻辑映射模式下进行设置原点,除了默认的坐标系是原点在左上角,向为正,向右为正外,其它非自定义模式都是原点在左上角,向下为负,向右为正的,和我们数学的二维坐标系一样,为了更好的体现出SetWindowOrg我将窗口分别变成我们数学上四个像限!它的作用是这样的:有一点point1,先将它从设备坐标变成该映射模式下的逻辑坐标(注意:一般设备坐标点是+,+ 逻辑坐标转换后是+,-的,由映射模式决定),然后它移动它的奇对称点使得坐标系跟着移动,当它的奇对称点到达原点时,原来的原点就到达point1的位置!(SetWindowOrg的参数就是point1的奇对称点)

CRect rect;
GetClientRect(&rect);
没设置前已经是第四象限了!

 

第一象限:
 CClientDC dc(this);
 dc.SetMapMode(MM_LOENGLISH);
 CPoint point1(0,rect.Height());//把原点移到左下角
 dc.DPtoLP(&point1);//先将设备坐标变成逻辑坐标!SetWindowOrg要求的!
 dc.SetWindowOrg(-point1.x,-point1.y);//两个负号取奇对称点!移对称点使得整个坐标跟着移使对称点移到原点
 CRect rect1(0,0,200,200);
 dc.Rectangle(&rect1);
第二象限:
 CClientDC dc(this);
 dc.SetMapMode(MM_LOENGLISH);
 CPoint point1(rect.Width(),rect.Height());//把原点移到右下角
 dc.DPtoLP(&point1);//逻辑坐标是相对于MM_LOENGLISH进行转换的,得到的坐标肯定是(+,-)
 dc.SetWindowOrg(-point1.x,-point1.y);
 dc.Rectangle(0,0,-200,200);
第三象限:
 CClientDC dc(this);
 dc.SetMapMode(MM_LOENGLISH);
 CPoint point1(rect.Width(),0);//把原点移到右上角
 dc.DPtoLP(&point1);
 dc.SetWindowOrg(-point1.x,-point1.y);
 dc.Rectangle(0,0,-200,-200);


上面的SetWindowOrg分开画的,我要的效果是要像上面的SetViewportOrg这样连着画:
其实在移完一个原点后,把原点移回(0,0)再移过就可以做到了:(第四象限忽略)
 CRect rect;
 GetClientRect(&rect);
        int width=rect.Width();
 int height=rect.Height();
 
 CClientDC dc(this);
 dc.SetMapMode(MM_LOENGLISH);
 CPoint point1(0,height);
 dc.DPtoLP(&point1);
 dc.SetWindowOrg(-point1.x,-point1.y);
 CRect rect1(0,0,200,200);
 dc.Rectangle(&rect1);
 
 
        dc.SetWindowOrg(0,0);
 point1=CPoint(width,height);
 dc.DPtoLP(&point1);
 dc.SetWindowOrg(-point1.x,-point1.y);
 dc.Rectangle(0,0,-200,200);

 dc.SetWindowOrg(0,0);
 point1=CPoint(width,0);
 dc.DPtoLP(&point1);
 dc.SetWindowOrg(-point1.x,-point1.y);
 dc.Rectangle(0,0,-200,-200);


如果我中间没有用dc.SetWindowOrg(0,0);就要思考了!
 CClientDC dc(this);
 dc.SetMapMode(MM_LOENGLISH);
 CPoint point1(0,height);
 dc.DPtoLP(&point1);
 dc.SetWindowOrg(-point1.x,-point1.y);
 CRect rect1(0,0,200,200);
 dc.Rectangle(&rect1);
 
 //先明确上一步我们的坐标原点在左下角,要把原点移到右下角,此时右下角相对当时的坐标系是(width,0)
 point1=CPoint(width,0);//移至(width,0)
 dc.DPtoLP(&point1);//变换成为逻辑坐标,但符号变为(+,-),因为在MM_LOENGLISH映射模式下
 dc.SetWindowOrg(-point1.x,point1.y);//(width,0)为(+,0)则它的对称点应为(-,0)才对,
                                     //只要将point1前一个变号即可,第二个为0不用变!
 dc.Rectangle(0,0,-200,200);

 

你可能感兴趣的:(对SetViewportOrg和SetWindowOrg的理解)