各位好
   我有个映射模式的问题。书上说:用MM_LOENGISH等5种映射模式时,例如如下代码:
        SetMapMode(hdc, MM_LOENGISH);
        TextOut( hdc, 100, -100, "Hello", 5 );
   为了避免坐标为负,一种解决方法是将逻辑(0,0)设为客户区的中心:
        SetViewportOrgEx( hdc, cxClient/2, cyClient/2,NULL);
   另一种是使用SetWindowOrgEx改变逻辑(0,0)点。如下:
        pt.x = cxClient;
        pt.y = cyClient;
        DPToLP(hdc, &pt, 1);
        SetWindowOrgEx( hdc, -pt.x/2, -pt.y/2, NULL );
   请问:
        1。两种方法的逻辑坐标系依然是y方向向上正向下负,设备坐标系y方向向下正,向上负?也就是两个坐标系依然各自用各自的坐标,互不影响?移动原点对各自的坐标不影响,只是影响了逻辑坐标系图形在客户区显示的位置?
        2。后一种方法的y方向偏移怎么是 -pt.y/2,怎么不是 pt.y/2 ?难道逻辑坐标系的(0,0)点偏移到原来(0,0)点的左下方去了(因为逻辑坐标系是y方向向上正,向下负)?怎么也想不明白。

解决方案 »

  1.   

    学院派类型的帖子好像大家关注得很少。
    我觉得虽然是基础,可是搞不清楚以后会很难受的,和楼主探讨一下,互相学习了。
    首先一点要说明的是,不管视口和窗口坐标原点如何变,设备点(0,0)始终是客户区左上角SetViewportOrgEx( hdc, cxClient/2, cyClient/2,NULL);
    是说,把视口(基于设备坐标)的原点设到cxClient/2,cyClient/2,窗口(基于逻辑坐标)的原点(0,0)就映射到cxClient/2,cyClient/2.这样逻辑点(0,0)就在中心了。    pt.x = cxClient;
            pt.y = cyClient;
            DPToLP(hdc, &pt, 1);
            SetWindowOrgEx( hdc, -pt.x/2, -pt.y/2, NULL );
    这个是先把设备坐标变为逻辑坐标,也就是说pt.x,pt.y实际上和cxClient,cyClient是一样大的,不过一个是设备坐标方式的度量,一个是逻辑坐标方式的度量。
    然后SetWindowOrgEx( hdc, -pt.x/2, -pt.y/2, NULL ); 巴窗口坐标(逻辑坐标)(-pt.x/2,-pt.y/2)映射到了视口坐标(设备坐标)的(0,0),既然设备坐标的(0,0)是逻辑坐标的(-pt.x/2,-pt.y/2),那设备坐标的(cxClient/2,cyClient/2)不就是逻辑坐标的(0,0)了。
    设备坐标(0+cxClient/2,0+cyClient/2)->    (逻辑坐标)                 (-pt.x/2+pt.x/2,-pt.y/2+pt.y/2)->(0,0)