在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); //此时的坐标都是逻辑坐标哦