windows GDI编程中关于窗口和视口,逻辑坐标和设备坐标的转换

本文详细介绍了映射方法(MappingMode)的概念及其应用。通过不同映射模式如MM_TEXT、MM_LOMETRIC等,阐述了逻辑坐标如何转换为设备坐标的过程,并讨论了在不同模式下SetWindowExt与SetViewportExt函数的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射方法(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()的影响。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值