理解映射方式、设备坐标系、逻辑坐标系、设置逻辑坐标原点与设备坐标原点

 在VC下进行GDI编程,理解映射方式、设备坐标系、逻辑坐标系、设置逻辑坐标原点和设备坐标原点,真的把我折磨的够厉害的,花了很多时间,终于弄明白一些了,在此记录下,以便以后温习。
 

一、关于映射方式


参考的网络文章地址:http://blog.csdn.net/xuyongbeijing2008/article/details/8063801 


映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了逻辑坐标系的X、Y轴的方向。所以,映射方式不仅影响逻辑单位的尺寸,也影响Y轴的正方向。

GDI的八种映射方式及其意义:

MM_TEXT:每个逻辑单位转换为一个图素,X正方向向右,Y正方向向下。(仅此一种方式是Y向下为正方向的)

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

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

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

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

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

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

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

二、设备(物理)坐标系与逻辑坐标系的理解

 

设备坐标系有三种:客户区坐标系、窗口坐标系、屏幕坐标系。

 

有一点非常重要,设备坐标系的X、Y轴的方向是固定的,单位也是固定的,X轴向右递增,Y向下递增,设备点(0,0)始终是客户区、窗口区或者屏幕区的左上角(也即是出图时候看到的)。映射方式只是针对逻辑坐标系的。

逻辑坐标系:

所有的GDI绘图操作的坐标都是在逻辑坐标系下坐标。当映射方式为MM_TEXT时(也是默认的映射方式),逻辑坐标系与设备坐标系是相同的。下面我们用其他的映射方式来试验一下。比如:

pDC->SetMapMode( MM_LOMETRIC ); //此时Y轴向上为正,X轴向右为正

pDC->SelectStockObject( GRAY_BRUSH );

pDC->Rectangle(100,-100,400,-400);  //此时的坐标都是逻辑坐标哦

结果如下所示:

 

三、函数CDC::SetWindowOrg与CDC::SetViewPortOrg的理解

 

函数CDC::SetWindowOrg是改变窗口(逻辑坐标)原点,如SetWindowOrg(100,100)则是将逻辑点(100,100)映射到为设备点(0,0); 

函数CDC::SetViewPortOrg是改变视口(设置坐标)原点,如SetViewPortOrg(100,100)则是将设备点(100,100),映射到为逻辑点(0,0)(注意:设备点(100,100)不要等同于逻辑点的(100,100));

分别举两个例子:

运用CDC::SetWindowOrg举例如下:

pDC->SetMapMode( MM_LOMETRIC ); //此时Y轴向上为正,X轴向右为正

pDC->SelectStockObject( DKGRAY_BRUSH );

pDC->SetWindowOrg(100,100);  将逻辑点(100,100)映射到设备点(0,0)上

pDC->Rectangle(100,-100,400,-400);  //此时的坐标都是逻辑坐标哦

 

运用CDC::SetViewPortOrg举例如下:

pDC->SetMapMode( MM_LOMETRIC ); //此时Y轴向上为正,X轴向右为正

pDC->SelectStockObject( DKGRAY_BRUSH );

pDC->SetViewportOrg( 100, 100 );  //将设备点(100,100)映射到逻辑点(0,0)上

pDC->Rectangle(100,-100,400,-400);  //此时的坐标都是逻辑坐标哦
 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值