一 、 MM_TEXT映射模式下:
这是默认的映射模式,相对容易理解,设备坐标系和逻辑坐标系的Y轴都是向下增加。
二 、MM_LOENGLISH , MM_LOMETRIC , MM_HIENGLISH , MM_HIMETRIC , MM_TWIPS映射模式下:
设备坐标系的Y轴向下增加,逻辑坐标系Y轴向上增加。
SetViewportOrgEx()使用的是设备坐标系中的点。
SetWindowOrgEx()使用的是逻辑坐标系中的点。
我们现在建立一个坐标系,(0 , 0)点在客户区中心,Y轴向上, X轴向右:
方法一:
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL);
方法二:
pt.x = cxClient ;
pt.y = cyClient ;
DptoLp(hdc , &pt , 1) ;//经转换后pt.y 是负值
SetWindowOrgEx(hdc , -pt.x /2 , -pt.y / 2 , NULL) ;
通过这两段程序验证了设备坐标系的Y轴方向向下,逻辑坐标系的Y轴方向向上
三 、 MM_ISOTROPIC与MM_ANISOTROPIC映射模式下:
设备坐标系的Y轴向下增加,
对于逻辑坐标系:
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
建立一个(0 , 0)点在客户区中心 , Y轴向上,X轴向右的坐标系,并画一条直线证明X,Y轴方向。
2. 当第一次设置映射模式为MM_ANISOTROPIC时,它继承前面设定的映射范围模式
Y轴方向有前映射模式决定。如:
SetMapMode(hdc , MM_ANISOTROPIC) ;
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
此时前映射模式为MM_TEXT(因其为默认值),建立一个(0 , 0)点在客户区中心Y轴方向向下 , X轴向右 ,并画一条直线证明X, Y轴方向。
SetMapMode(hdc , MM_HIENGLISH) ;
SetMapMode(hdc , MM_ANISOTROPIC) ;
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
这是默认的映射模式,相对容易理解,设备坐标系和逻辑坐标系的Y轴都是向下增加。
二 、MM_LOENGLISH , MM_LOMETRIC , MM_HIENGLISH , MM_HIMETRIC , MM_TWIPS映射模式下:
设备坐标系的Y轴向下增加,逻辑坐标系Y轴向上增加。
SetViewportOrgEx()使用的是设备坐标系中的点。
SetWindowOrgEx()使用的是逻辑坐标系中的点。
我们现在建立一个坐标系,(0 , 0)点在客户区中心,Y轴向上, X轴向右:
方法一:
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL);
方法二:
pt.x = cxClient ;
pt.y = cyClient ;
DptoLp(hdc , &pt , 1) ;//经转换后pt.y 是负值
SetWindowOrgEx(hdc , -pt.x /2 , -pt.y / 2 , NULL) ;
通过这两段程序验证了设备坐标系的Y轴方向向下,逻辑坐标系的Y轴方向向上
三 、 MM_ISOTROPIC与MM_ANISOTROPIC映射模式下:
设备坐标系的Y轴向下增加,
对于逻辑坐标系:
1. 当第一次设置映射模式为MM_ISOTROPIC时 , window使用与MM_LOMETRIC映射模式相同的窗口和范围 ,Y轴向上。
如:
SetMapMode(hdc , MM_ISOTROPIC) ;SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
建立一个(0 , 0)点在客户区中心 , Y轴向上,X轴向右的坐标系,并画一条直线证明X,Y轴方向。
2. 当第一次设置映射模式为MM_ANISOTROPIC时,它继承前面设定的映射范围模式
Y轴方向有前映射模式决定。如:
SetMapMode(hdc , MM_ANISOTROPIC) ;
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
此时前映射模式为MM_TEXT(因其为默认值),建立一个(0 , 0)点在客户区中心Y轴方向向下 , X轴向右 ,并画一条直线证明X, Y轴方向。
SetMapMode(hdc , MM_HIENGLISH) ;
SetMapMode(hdc , MM_ANISOTROPIC) ;
SetViewportOrgEx(hdc , cxClient / 2 , cyClient / 2 , NULL) ;
MoveToEx(hdc , 0 , 0 , NULL) ;
LineTo(hdc , 100 , 100) ;
在前映射模式为MM_HIENGLISH下, 建立一个(0 , 0)点在客户区中心Y轴方向向上,X轴方向向右的坐标系,并画一条直线证明X, Y轴方向。
总结:
1.设备坐标系的Y轴方向始终向下增加。
2.在MM_ISOTROPIC和MM_ANISOTROPIC模式下我们可以用SetViewportExtEx()和SetWindowExtEx()设定坐标范围同时还可以改变Y轴方向。
3.在默认模式MM_TEXT下设备坐标范围和逻辑坐标范围是1:1因此可以假设是相同使用但是在其他模式下需要用DPtoLP()或LPtoDP()转换。