MFC基本图形的绘制(二)坐标映射

在讨论坐标之前,先看下列语句:

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.1mmx向右为正,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映射模式下:纵横比总是11,也就是说,无论比例

因子如何变化,圆总是圆的。但,MM_ANISOTROPIC映射模式下xy的比

例因子可以独立地变化,即圆可以被拉扁成椭圆形状。

在映射模式MM_ANISOTROPICMM_ISOTROPIC中,常常可以调CDC::SetWindowExt(设置窗口大小)CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。

“窗口”和“视口”的概念往往不易理解。所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定xy的比例因子,它们的关系如下:

  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)编译运行,当你改变窗口大小,椭圆也随之改变。

 

你可能感兴趣的:(mfc,图形的绘制,坐标映射)