在讨论坐标之前,先看下列语句:
pDC->Rectangle(CRect(0,0,200,200));
这是在某个设备环境中绘制一个高为200个像素,宽也为200个像素的方块。由于默认的映射模式是MM_TEXT,其逻辑坐标(在各种映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。因此这个方块在1024*768的显示器上看起来要比在640*480的显示器上显得小一些,而且若将它打印在600dpi精度的激光打印机上,这个方块就会显得更小了。为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式(如下所示):这些映射决定了设备坐标和逻辑坐标之间的关系。
映射模式 含义
MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正
MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正
MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正
MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正
MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正
MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正
MM_ANISOTRPIC x,y 可变比例
MM_ISOTROPIC x,y 等比例
这样,我们就可以通过调用CDC::SetMapMode(int nMapMode)来设置相应的
映射模式。例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调
用上述语句,都将显示出20*20mm的方块。
而MM_ISOTROPIC映射模式下:纵横比总是1:1,也就是说,无论比例
因子如何变化,圆总是圆的。但,MM_ANISOTROPIC映射模式下,x和y的比
例因子可以独立地变化,即圆可以被拉扁成椭圆形状。
在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。
“窗口”和“视口”的概念往往不易理解。所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:
x比例因子=视口x大小/窗口x大小
y比例因子=视口y大小/窗口y大小
例:将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也
会随之改变。(通过设置窗口和视口大小来改变显示的比例)
(1)建一个单文档应用程序,名为“椭圆的绘制”
(2)在View类的OnDraw函数里加如下代码:
void CMyView::OnDraw(CDC* pDC) { //CMyDoc* pDoc = GetDocument(); //ASSERT_VALID(pDoc); CRect rectClient;//定义矩形对象 GetClientRect(rectClient);//获得当前窗口的客户区大小 pDC->SetMapMode(MM_ANISOTROPIC);//设置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));//椭圆的4个坐标点 // TODO: add draw code for native data here }
(3)编译运行,当你改变窗口大小,椭圆也随之改变。