您的位置:首页 > 其它

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

2014-03-26 00:28 309 查看
在讨论坐标之前,先看下列语句:

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)编译运行,当你改变窗口大小,椭圆也随之改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: