VC中有关屏幕映射方式

 

在一般的情况之下,我们都以像素作为绘图的单位,我们称之为设备坐标。我们在进行绘图操作的时候,不可避免的要用到设备坐标系。

 

WINDOWS提供了几种映射方式,或称坐标系。可以通过它们来和设备上下文相联系。比方说不管是什么样的显示设备,如果我们需要在上面显示一个2英寸高,2英寸宽的矩形,该怎样处理呢?这就要依赖于我们所设定的坐标系。如果我们指定了MM_TEXT 方式,这时坐标原点就位于屏幕的左上角,X轴和Y轴的方向分别指向我们面对屏幕的右方和下方,它的绘图单位是像素,如果一英寸对应72个像素的话,我们就需要这样绘制这个矩形:

 

DC.Rectangle(CRect( 0,0,72*2,72*2));

 

所以我们如果我们指定了MM_LOENGLISH 方式,那么一个绘图单位就是百分之一英寸,坐标原点仍然位于屏幕的左上角,但是X轴和Y轴的方向恰好和MM_TEXT方式下的轴方向相反,同样完成绘制上面提到的矩形的工作,我们就需要写出这样的代码:

 

DC.Rectangle(CRect(0,0,200,_200));

 

可见,坐标系的选择对我们编写程序有很大的影响。

 

此外,在有些时候,我们需要在几个不同的坐标系下面工作,那么还需要在进行在这些坐标系之间的转换工作。所以,我们有必要在这里详细介绍以下WINDOWS的坐标映射方法。

 

一般来说,最常用的就是WM_TEXT方式。在WM_TEXT坐标方式下面,坐标被映射到了像素,X的值向右方递增,Y的值向下递增,并且可以通过调用CDC的SetViewpotOrg函数来改变坐标原点。下面的代码把屏幕映射方式设为MM_TEXT方式,并且把坐标原点设在(300,300)处:

 

DC.SetMapMode(MM_TEXT);

 

DC.SetViewportOrg(CPoint(300,300));

 

另外,WINDOWS提供了一组非常重要的比例固定的映射方式,在这些映射方式下面,我们可以改变它的坐标原点,却无法改变它的比例因子。对于MM_LOENGLISH映射方式,我们已经知道它的X值是向右递减的,Y的值是向下递减的,所有的固定比例的映射方式都遵循这一原则。它们的比例因子也各不相同。我们列表如下:

 

 

最后一种映射方式MM_TWIPS常常用语打印机,一个twip单位相当于1/20个点(一点近似与1/72)英寸。例如,如果指定的MM_TWIPS一个社单位,那么对于12点大小的字模来说,字符的高度为12x20,即240个twip。

 

除了固定比例的映射方式,WINDOWS还提供了比例可变的映射方式,在这种映射方式下面,我们除了可以改变它们比例因子之外还可以改变比例因子。借助于这样的映射方式,当用户改变窗口的尺寸的时候,绘制的图形的大小也可以根据比例发生相应的变化;同样,当我们翻转某个轴的时候,他们所绘制的图像,也以另外的一个轴为轴心进行翻转。这样的映射方式有两种:MM_ISOTROPIC和 MM_ANIOTROPIC。

 

在MM_ISOTROPIC方式下,纵横的比例为1:1,换句话说,无论比例因子如何变化,我们画出的图形不会改变自己的形状。但是在MM_ANIOSTROPIC方式下面,X和Y的比例因子可以独立地变化,图形的形状可以发生变化。

 

我们分析下面这段程序:

 

void CAView::OnDraw(CDC *pDC)

 

 

 

{

 

 

 

   CRect clientDC;

 

 

 

   GetClientRect(clientRect);

 

 

 

   pDC_>SetMapMode(MM_ANISOTROPIC);

 

 

 

   pDC_>SetWindowExt(1000,1000);

 

 

 

   pDC_>SetViewportExt(clientRect.right,_clientRect.bottom);

 

 

 

   pDC_>SetViewportOrg(clientRect.right/2, clientRect.bottom/2);

 

 

 

   pDC_>Ellipse(CRect(_500, _500, 500, 500));

 

 

 

}

 

 

 

这段代码的功能是这样的,首先取得窗口客户区矩形的大小,然后用SetWindowExt和SetViewportExt函数设定比例,结果窗口尺寸的大小被设为1000个逻辑单位高和1000个逻辑单位宽,坐标原点被设为窗口的中心,在这样的设置之下,绘制出一个半径为500个逻辑单位的椭圆。

 

在这里如果将映射方式改变为MM_ISOTROPIC那么就将画出一个圆。圆的直径是窗口举行宽和高的最小值。

 

下面我们给出逻辑单位到设备单位的公式:

 

X比例因子 = X视口范围/X窗口范围

 

Y比例因子 = Y视口范围/Y窗口范围

 

设备X = 逻辑X *X比例因子 + X坐标原点偏移

 

设备Y = 逻辑Y *Y比例因子 + Y坐标原点偏移

 

当我们设定了设备上下文的映射方式之后,就可以直接使用逻辑坐标作为其参数了,但是从WM_MOUSEMOVE消息所获得的鼠标的坐标值是设备坐标。许多其他的MFC库函数,尤其是类CRect的成员函数,只接受设备坐标。所以我们有时要利用CDC的LPtoDP和DPtoLP在逻辑坐标和设备坐标之间进行转换的工作。

 

下面我们列出进行坐标映射工作的时候所要遵循的一些规则:

 

可以认为CDC的所有成员函数都以逻辑坐标作为参数,但和CRect有关的函数例外。

可以认为CWnd 的成员函数都以设备坐标作为参数。

所有的HIT_TEST操作都应该考虑设备坐标。

以逻辑坐标的形式来保存数据,否则用户对窗口进行滚动操作的时候,这个数据就不再有效了。

 

//

SetMapMode

开放分类: Windows API函数

 

SetMapMode 函数状态: 正式函数 ,建设者:zhbxj ,最新更新时间: 2001-8-31 18:52:58 修改该函数 

 

函数功能描述:该函数设置指定设备环境的映射方式,映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了设备的X、Y轴的方向

 

函数原型:int SetMapMode(HDC hdc, int fnMapMode);

 

参数:

 

    hdc:指向设备环境的句柄。

 

    fnMapMode:指定新的映射方式,此参数可以是下面列出的任何一个值。

 

    MM_ANISOTROPIC:逻辑单位转换成具有任意比例轴的任意单位,用SetWindowExtEx和SetViewportExtEx函数可指定单位、方向和比例。

 

    MM_HIENGIISH:每个逻辑单位转换为0.001英寸,X的正方面向右,Y的正方向向上。

 

    MM_HIMETRIC:每个逻辑单位转换为0.01毫米,X正方向向右,Y的正方向向上。

 

    MM_ISOTROPIC:逻辑单位转换成具有均等比例轴的任意单位,即沿X轴的一个单位等于沿Y轴的一个单位,用和函数可以指定该轴的单位和方向。图形设备界面(GDI)需要进行调整,以保证X和Y的单位保持相同大小(当设置窗口范围时,视口将被调整以达到单位大小相同)。

 

    MM_LOENGIISH:每个逻辑单位转换为0.1英寸,X正方向向右,Y正方向向上。

 

    MM_LOMETRIC:每个逻辑单位转换为0.1毫米,X正方向向右,Y正方向向上。

 

    MM_TEXT:每个逻辑单位转换为一个图素,X正方向向右,Y正方向向下。

 

    MM_TWIPS;每个逻辑单位转换为打印点的1/20(即1/1400英寸),X正方向向右,Y方向向上。

 

    返回值:如果函数调用成功,返回值指定先前的映射方式,否则,返回值为零,若想获得更多错误信息,请调用GetLastError函数。

 

备注:MM_TEXT方式允许应用程序以设备像素为单位来工作,像素的大小根据设备不同而不同。MM_HIENLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC和MM_TWIPS方式对必须用物理意义单位(如英寸或毫米)制图的应用程序是非常有用的。MM_ISOTROPIC方式保证了1:1的纵横比。MM_HIENLISH方式允许对X和Y坐标分别进行调整。

 

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。

 

 

例子:SetMapMode (hdc, MM_ISOTROPIC);//设定映像模式

 

   SetWindowExtEx (hdc, 1000, 1000, NULL);

 

   SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL);

 

   SetViewportOrgEx (hdc, cxClient / 2,  cyClient / 2, NULL);//设定视口原点坐标

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值