MM_TEXT映射模式:
在MM_TEXT中,坐标映射到像素,如果向右移动,X值增加;如果向下移动,Y值增加,但是,通过CDC函数SetViewportOrg和SetWindowOrg,可以改变原点。下面的一些代码把窗口原点在逻辑坐标中设置到(100,100),然后通过(100,100)绘制一个200*200像素的方框。逻辑点(100,100)映射到设备点(0,0)。滚动窗口使用的就是这种变换。
Void CMyView::OnDraw(CDC * pDC)
{pDC->SetMapMode(MM_TEXT);
pDC->SetWindowOrg(CPoint(100,100);
pDC->Rectangle(CRect(100,100,300,300));
}
这样程序里用的大多数都是逻辑坐标,而到显示器上显示用的是设备坐标。
固定比例的映射模式:
Windows提供了非常重要的一组固定比例映射模式,所有固定比例的映射模式都按:x向右移动增加,y向下移动减少。并且不能改变它。在固定比例的映射模式中,唯一的不同是实际的比例因子,如下:
映射模式 | 逻辑单位 |
MM_LOENGLISH | 0.01英寸 |
MM_HIENGLISH | 0.001英寸 |
MM_LOMETRIC | 0.1毫米 |
MM_HIMETRIC | 0.01毫米 |
MM_TWIPS | 1/1440英寸 |
可变比例的映射模式:
WINDOWS提供了两种映射模式:
MM_ISOTROPIC 和 MM_ANISOTROPIC,它们允许我们改变比例因子和原点。
使用这些映射模式,在用户改变窗口的大小时,绘制的内容也会改变大小。还有,如果改变一个轴的比例,则所绘制的图像也会在其他轴进行相应的改变,并且我们还可以定义r任意的固定比例因子。
使用MM_ISOTROPIC方式,则始终保持1:1的纵横比。换句话说,无论比例因子如何改变,一个圆始终是一个圆。在MM_ANISOTROPIC方式中,X和Y比例因子可以分别改变,圆可以压成椭圆。
下面是一个OnDraw函数,它可以绘制一个椭圆,正好放在一个窗口中:
void CMyview::OnDraw(CDC * pDC)
{
CRect rectClient;
GetClientRect(rectClient);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000,1000);
pDC->SetViewportExt(rectClient.right, -rectClient.bottom);
pDC->SetViewportOrg(rectClient.right/2, rectClient.bottom.2);
pDC->Ellipse(Crect(-500,-500,500,500));
}
下面是把逻辑单位转换到设备单位的公式:
x比例因子 = x视口长度 / x窗口长度;
y比例因子 = y视口长度 / y窗口长度;
设备x = 逻辑x * x比例因子 + x原点偏移量;
设备y = 逻辑y * y比例因子 + y原点偏移量;
坐标转换:
物理坐标到逻辑坐标的换算是自己决定的,但是,WINDOWS GDI负责逻辑坐标到设备坐标的换算。
CDC函数 LPtoDP 和 DPtoLP 可以在两个系统之间进行换算。你的工作是决定何时使用哪一个系统。一些重要的规则如下:
1.假定CDC成员函数具有逻辑坐标参数;
2.CWND成员函数具有设备坐标参数;
3.在设备坐标中进行所有的健击测试操作。在设备坐标中定义区域。像CRect::PtInRect这样的函数,只有在使用设备坐标时,才能保证结果的正确性。
4.在逻辑或者物理坐标中存储长期使用的值