SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;到底是个什么原理,一直想不通。。

解决方案 »

  1.   

    去百度百科或者msdn搜一下 明白了 说的很清楚
      

  2.   

     SetWindowOrg 、SetViewportOrg、SetWindowExt、SetViewportExt区别
    按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:
    page space---->device space
    pDC->SetMapMode(MM_LOMETRIC);
    pDC->SetWindowOrg(40,0);  //这句“设定”page space的原点为(40,0),注意,
    //这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这一句对下面的画图函数在page space中所作的图不会有任何影响。一句话:SetWindowOrg就是指定一下,page space中哪个点为原点。
    pDC->Rectangle(0,0,100,-100);
    pDC->Rectangle(0,-100,50,-200);
    同理,SetViewportOrg也是指定一下,device space中哪个点为原点,两个坐标系映射时,两个原点重合。
    SetWindowExt设定page space的大小,SetViewportOrg设定device space的大小,其实,真正有意义的只是两者的比例关系,例如,在一个1024*768的显示屏上:
    pDC->SetMapMode(MM_ISOTROPIC);
    pDC->SetWindowExt(10240,7680);
    pDC->SetViewportExt(1024,768);
    pDC->Rectangle(0,0,100,100);
    就会画一个10 pixels*10 pixels的矩形。其本质就是,X方向,每个逻辑单位有1024/10240个象素,Y方向每个逻辑单位有768/7680个象素。因此,下面的代码有相同的作用:
    pDC->SetMapMode(MM_ISOTROPIC);
    pDC->SetWindowExt(102400,76800);
    pDC->SetViewportExt(10240,7680);
    pDC->Rectangle(0,0,100,100);
      

  3.   

    看了下heksn的解释的确是醍醐灌顶的感觉。其实问题本身我没说清楚:
    我比如我现在在MM_TEXT的映射方式下,同时执行
    SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; 
    SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL);
    为什么逻辑坐标系会跑到客户区的右下角。实际上第一行把设备坐标的原点设定到原来的(cxClient / 2,cyClient / 2)的位置,而第二行把逻辑坐标的原点设定到原来(-cxClient / 2,-cyClient / 2)的位置。那么很显然逻辑坐标(-cxClient / 2,-cyClient / 2)就应该映射到设备坐标(cxClient / 2,cyClient / 2)了。十分感谢。