请问以下几句分别是做了什么操作?并且说说坐标原点的变化
SetMapMode (hdc, MM_ISOTROPIC) ;
        
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
        
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
        
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
第2句我知道是将显示区的高和宽分成32767个段的Y和X.(这是逻辑上的)
一开始原点在左上角,其他的就有点不明白了

解决方案 »

  1.   

    SetViewportExtEx   (hdc,  cxClient ,   -cyClient,   NULL)   ; 
    ------------------------------
    视口向右最大是cxClient,向下到底部是-cyClient,(也就是说向下为负,向上为正)
    SetViewportOrgEx   (hdc,   0,   cyClient,   NULL)   ; ---------------------------------------------
    将视口的(0,cyClient)点设为原点(左上角),视口原点上移了cyClient,原来的原点在窗口中的位置也就下移了 32767(注意不是cyClient),也就是原来的视口原点在窗口的左下角了
      

  2.   

    SetWindowExtEx (hdc, 276, 72, NULL) ;       
    SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
    理解为逻辑坐标系长宽(276,72)对应屏幕坐标长宽(cxClient, cyClient).SetWindowOrgEx (hdc, 138, 36, NULL) ;
    SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
    逻辑坐标系点(138,36)即逻辑中点,对应屏幕坐标(cxClient / 2, cyClient / 2)即屏幕中点.那么
    OffsetWindowOrgEx (hdc, -12, 0, NULL) ;
    是什么意思?
      

  3.   

    OffsetWindowOrgEx   (hdc,   -12,   0,   NULL); 
    ------------------------------------
    在当前的坐标原点为的基础上再向上(根据上面码,向上为负)移12,
    相当于SetViewportOrgEx(hdc,cxClient/2 -12,cyClient /2,NULL) 
      

  4.   

    向上吗?为什么不是向左?
    SetWindowExtEx(hdc,   276,   72,   NULL)   ;               
    SetViewportExtEx   (hdc,   cxClient,   cyClient,   NULL)   ; 
    SetWindowOrgEx   (hdc,   138,   36,   NULL)   ; 
    SetViewportOrgEx   (hdc,   cxClient   /   2,   cyClient   /   2,   NULL)   ;
    调用这几个函数之后逻辑原点和屏幕原点分别在什么位置?坐标轴是什么样子?
      

  5.   

    看错了,向左
    ---------------------
    回上面。
    逻辑原点和窗口原点都在窗口中央,向上为负,向下为正,左为负右为正(假设cxClient,cyClient 都为正)
      

  6.   

    如果是
    SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
            
    SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;
    那么逻辑原点和窗口原点分别在哪呢?
      

  7.   

    <WINDOWS程序设计>书上这么讲的.
    在每次呼叫OffsetWindowOrgEx后,将窗口原点向右移动42个单位。
    真的搞不明白....
      

  8.   

    回五楼,说错了(今天状态不好,LZ千万不要轻易信我,参考就行了)
    SetWindowExtEx(hdc,       276,       72,       NULL)       ;                               
    SetViewportExtEx       (hdc, cxClient, cyClient, NULL) ;   
    SetWindowOrgEx       (hdc, 138,36, NULL);   
    SetViewportOrgEx (hdc, cxClient /2, cyClient/2,NULL); 
    -----------------------------------------------
    这个应该设备坐标原点在窗口左上角。(相对没有变化)
    回7楼
    设备坐标原点在窗口右下角。回8楼
    这要根据你的逻辑分辨率来算
      

  9.   

    执行
    SetViewportOrgEx   (hdc,   cxClient   /   2,   cyClient   /   2,   NULL)   ; 
    后窗口原点和视口原点是怎么变化的?                
    是不是窗口原点到了显示区中间,视口原点没变化?SetWindowOrgEx   (hdc,   -cxClient   /   2,   -cyClient   /   2,   NULL)   ; 
      

  10.   

    SetViewportOrgEx(hdc,cxClient/2, cyClient/2, NULL)
    --------------------------------------------
    视口原点在窗口中央,窗口原点没变,但相对于视口原点向左上移了cxClient/2,cyClient/2(窗口原点在视口的坐标)SetWindowOrgEx(hdc,-cxClient/ 2, -cyClient/2, NULL);   
    再把窗口原点的坐标向左上移cxClient/2,cyClient/2,相对地,视口原点在窗口的右下角
      

  11.   

    书上这么写的:
    如果想将逻辑点(0,0)定义为显示区域的中心,可进行如下呼叫:
    SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
    逻辑点(0,0)将映像为设备点(cxClient/2,cyClient/2).改变位置的不是逻辑点(0,0)吗?从原来的左上角到了中间不是吗?
      

  12.   

    回13楼,
    --------------------------------------
    如果想将逻辑点(0,0)定义为显示区域的中心,可进行如下呼叫: 
    SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
    --------------------------------------------------
    这是将视口原点移到了备坐标的cxClient/2,cyClient/2, ,而窗口原点对应于设备坐标的位置没有变;
    相对地,
    SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);

    SetViewportOrgEx(hdc,-cxClient/2,-cyClient/2,NULL); //假设逻辑分辨率也是像素
    在视觉上是同样的效果-----------------------------
    希望我的解释不致使LZ更迷惑,LZ要分清逻辑坐标与窗口的关系,设备坐标与视口的关系,视口与窗口的关系。
    好像windows程序设计上有详细解释
      

  13.   

    我就是看WINDOWS程序设计看的我一时明白一时又不明白...
      

  14.   

    我终于想通了.
    以这个为例子:
    SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 
    SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);    
    -------------------------
    一个事物是否在运动或者是否改变了位置需要一个参照物(即一个假设为不变不动的物体).
    SetViewportOrgEx和SetWindowOrgEx调用的时候都以设备原点为参照物,所以假设设备原点是不会改变(在窗口的左上角为设备点(0,0))
    SetViewportOrgEx函数作用:引用书上的话,"逻辑点(0.0)映像为设备点xViewOrg,yViewOrg)".
    即当单独调用 SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 时([cxClient/2,cyClient/2]是设备坐标),按照设备原点在左上角不变的原则,点(cxClient/2,cyClient/2)则在窗口中间.所以逻辑原点(0,0)就在窗口的中间.
    SetWindowOrgEx函数作用:引用书上的话,"逻辑点(xWinOrg,yWinOrg)映像为设备点(0,0)".
    即当单独调用SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);时([-cxClient/2,-cyClient/2]是逻辑坐标),同样按照设备原点在左上角不变的原则,逻辑点(-cxClient/2,-cyClient/2)即窗口的左上角,因此逻辑点(0,0)在窗口的中间位置.如果同时使用SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 
    SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL); 的时候,调用完SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 后设备原点已经改变(上面所说的设备原点不会改变是正在调用函数的时候,当调用完函数的时候设备原点就会随参数改变).即现在的设备原点(0,0)是原来的设备原点(cxClient/2,cyClient/2)的位置(即窗口的中间).因此调用SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);后按照设备原点在窗口中间,因此逻辑点(-cxClient/2,-cyClient/2)是窗口中间,即逻辑原点(0,0)在窗口的右下角.我这样的理解应该没错吧?有错请指出.