SetWindowOrg与SetViewportOrg函数的用法浅见

我最近也遇到了windows的坐标问题.到网上看了一些文章,一时也坠入云里雾里,自己在VC6.0里编码跟踪,终于觉悟,写出来供大家参考.

      在View或其派生类中定义函数:

   void   CMyView::studySetViewportOrg(CDC * pDC)

  {

    int n=pDC->GetMapMode();//默认模式MM_TEXT

    pDC->SetMapMode(MM_LOMETRIC); //映射为常用直角坐标系,注意坐标单位(0.1mm)


 视口设备坐标与逻辑坐标初始位置重合,在客户区左上角..

         //第一次移动逻辑原点
 pDC->SetViewportOrg(50 , 100);//逻辑原点移到视口设备坐标(50,100)处, 该函数以视口设备坐标为参考系
 CPoint pV1=pDC->GetViewportOrg();//返回是逻辑原点在视口设备坐标中的位置(设备坐标),,即(50,100)
 DrawOrdinate(pDC);//观察逻辑坐标位置.

        //第二次移动逻辑原点     

 CRect rect1;
 GetClientRect(&rect1);//GetClientRect取得的是客户区设备坐标,
 int x=rect1.Width ()/2;
 int y=rect1.Height ()/2;
 pDC->SetViewportOrg (x,y);  //逻辑原点移到窗口中心

 CPoint pV=pDC->GetViewportOrg();//

 DrawOrdinate(pDC);//观察逻辑坐标,已经在窗口中心.
   
    //在SVO切换到SWO要特别注意,在调用SWO之时,视口设备坐标原点与当前逻辑原点重合.反之也然.
   //这是令人费解的地方.我也曾在此被搞晕了.

 

 GetClientRect(&rect1);//发现客户区设备坐标是不变的,
 pDC->DPtoLP (&rect1);//转换成逻辑坐标.

           //第三次移动逻辑原点
 pDC->SetWindowOrg (50,100);  //此函数以新的逻辑坐标系为参照,(50,100)是视口原点的逻辑坐标

                                                        //移动的依然是逻辑原点
                                                       //此时视口设备原点与最后一次SetViewportOrg()设置的逻辑原点是重合的.
 CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
 DrawOrdinate(pDC);//观察坐标.

              //第四次移动逻辑原点

 pDC->SetWindowOrg (200,200);  //.

 CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
 DrawOrdinate(pDC);//观察

 
  
}

///

//绘制坐标

void MyView::DrawOrdinate(CDC* pDC)
{
 pDC->MoveTo(-100,0);
 pDC->LineTo (100,0);
 pDC->MoveTo (0,-100);
 pDC->LineTo (0,100);

 pDC->MoveTo(100,0);
 pDC->LineTo (70,30);
 pDC->MoveTo (100,0);
 pDC->LineTo (70,-30);

 pDC->MoveTo(0,100);
 pDC->LineTo (30,70);
 pDC->MoveTo (0,100);
 pDC->LineTo (-30,70);

}

 

以上代码已经调试.

提醒:

     1,SWO和SVO移动的都是逻辑坐标.所以只要使用其中一个就行.

     2.由SVO到SWO切换时,视口设备坐标原点同当前逻辑原点重合.说不定你在次晕头转向

       在程序中最好不这样做.以便于理解.

     3SWO和SVO使用的参照系不同,

     4.屏幕坐标,窗口客户区坐标,视口坐标都是设备坐标,逻辑坐标由映射而生.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值