映射方法(Mapping Mode) | 逻辑单位 | 坐标轴方向 |
MM_TEXT(默认方式) | 1 pixel | X轴正方向朝右,Y轴正方向朝下 |
MM_LOMETRIC | 0.1 mm | X轴正方向朝右,Y轴正方向朝上 |
MM_HIMETRIC | 0.01 mm | X轴正方向朝右,Y轴正方向朝上 |
MM_LOENGLISH | 0.01 inch | X轴正方向朝右,Y轴正方向朝上 |
MM_HIENGLISH | 0.001 inch | X轴正方向朝右,Y轴正方向朝上 |
MM_TWIPS | 1/1440 inch | X轴正方向朝右,Y轴正方向朝上 |
MM_ISOTROPIC | 自定义(X=Y) | 自定义 |
MM_ANISOTROPIC | 自定义(X!=Y) | 自定义 |
首先是上面的表格里的解释,这里只解释逻辑单位这一列。所谓的逻辑单位:就是采用逻辑单位的API在DC上绘图后(比如图里面有一个逻辑坐标点(10, 10)),逻辑坐标点(10, 10)到底应该在设备上的哪个像素点(设备坐标点)上显示出来,其实逻辑单位(其实还要加上坐标轴方向)就是来给出这种映射关系的。
比如:dc.Ellipse(0,0,500,500); 这里的绘图函数里的坐标(0,0)和(500, 500)就是逻辑坐标了。就是说在逻辑的画布上画了一个以(0, 0)和(500, 500)两点生成的矩形的内切椭圆。
1.dc.SetMapMode(MM_TEXT);
这个(0, 0)和(500, 500)逻辑坐标点映射到设备上就是(0pix, 0pix)和(500pix, 500pix)像素坐标点。
2.dc.SetMapMode(MM_LOMETRIC);
这个(0, 0)和(500, 500)逻辑坐标点映射到设备上就是(0mm, 0mm)和(50mm, 50mm)坐标点。如果是在显示器上显示,还要把(0mm, 0mm)和(50mm, 50mm)转换成为像素点为单位的坐标。如果是打印机这样的转换会比较精确,如果是显示器这个转换(mm到pix)会有比较大的误差,貌似是显示器的DPI不确定的缘故,打印机的DPI比较确定。
3.dc.SetMapMode(MM_HIMETRIC);
这个(0, 0)和(500, 500)逻辑坐标点映射到设备上就是(0mm, 0mm)和(5mm, 5mm)坐标点。如果是在显示器上显示,还要把(0mm, 0mm)和(5mm, 5mm)转换成为像素点为单位的坐标。
4.MM_LOENGLISH和MM_HIENGLISH以及MM_TWIPS这些和上面的1,2,3一样,都事这种转换,由于此种逻辑单位的映射关系都是确定的(比例大小确定和方向确定),所以在这几种模式下的SetWindowExt()和SetViewportExt()这两个函数是无效的,不需要调用,调用了也不会有效果。
5.MM_ISOTROPIC和MM_ANISOTROPIC这两个模式由于什么都没有确定,所以SetWindowExt()和SetViewportExt()是需要设置的。SetWindowExt(50, 50)表示画图的逻辑画布的大小(50,50)的宽高是逻辑单位。SetViewportExt(100, 100)表示显示这块逻辑画布的视口区域大小(要把这块画布刚好显示完,铺满),是指在设备上的区域大小,(100, 100)是设备坐标,如果是显示器就是像素。
SetWindowOrg(50, 100)和SetViewportOrg(10, 50); 表示,逻辑坐标的点(50, 100)要映射在设备坐标(10pix,50pix)上(如果是显示器的话)。其他的点都按照这个偏移量进行映射。
总结:SetWindowOrg()和SetViewportOrg()就是设置映射偏移量,SetWindowExt()和SetViewportExt()就是设置映射比例。SetWindowOrg()和SetViewportOrg()在所有模式下都有效,SetWindowExt()和SetViewportExt()只在最后两个模式下有效。其中dc.LPtoDP(&pt);这个函数和dc.DPtoLP(&pt);这个函数是把坐标点在逻辑坐标和设备坐标之间相互转换的函数,也会受到SetWindowExt()和SetViewportExt()(如果是最后两种模式)以及。SetWindowOrg()和SetViewportOrg()的影响。