映射模式

来源:互联网 发布:mac qq 5.2 编辑:程序博客网 时间:2024/04/29 03:01

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.在逻辑或者物理坐标中存储长期使用的值

 

原创粉丝点击