网站大量收购独家精品文档,联系QQ:2885784924

Windows GDI中的坐标系.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows GDI中的坐标系

Windows GDI中的坐标系 如果你用GDI输出过文本、位图、或者绘制过如直线、曲线的图形,那么你必然使用过坐标系。屏幕分辨率为96dpi(dot per inch),打印机的分辨率通常为600dpi,而你使用如MoveTo(hDC,100,100);LineTo(hDC,1300,1300);在两者之上却可能生成完全相同的两条线(此即所见即所得WYSIWYG)。就实现原理而言,坐标系在其中扮演着决定性的角色。一、什么是GDI坐标系?首先从数学的角度看,GDI坐标系是二维笛卡尔坐标系,通过两条轴和原点就可以确定平面上任何一点的位置。从使用的角度看,GDI坐标系是一种转换规则,把你所制定的逻辑数据转换成最终设备驱动所能使用的数据。比如(100,100)这一点,经过实际的变换,在96dpi的屏幕上就可能是(9.6,9.6),在600dpi的打印机上则可能是(60,60)。(注一)GDI坐标系由四层坐标空间组成(注二),按层次的高低分别为:世界坐标空间(World-Space):支持affine变换,应用于下面所说的页面坐标空间之上,只在NT类操作系统中有支持。页面坐标空间(Space):支持大量预定义的映射模式,是必然会被使用的坐标空间。原点和相应的缩放比率的设置适合在页面坐标空间中进行设定。世界坐标空间和页面坐标空间统称为逻辑坐标空间,是GDI用户所能够直接使用的坐标空间。也就是说进行GDI输出时,你所指定的位置、大小等信息只能是相对于逻辑坐标空间的数据。设备坐标空间(Device-Space):同设备上下文相关联的设备空间。可以表示物理设备的一小块或者整个物理设备。由于各种GDI输出是面向设备上下文的,逻辑坐标空间中的相关数据自然也就必须要转化为设备坐标空间中的数据。物理设备坐标空间(Physical-Device Space):图形设备的物理表面的部分或全部。也就是图形驱动程序所使用的坐标空间。任何GDI输出最终想在显示器或打印机上成形都要经过相关的驱动程序,进行设备坐标空间向物理设备坐标空间的转换就成为一种必然。这个过程完全由系统完成。所以DC的原点和大小信息是只读的。(为表述方便以下将用DC表示设备上下文)二、输出位置到底在那儿?由上述说明可见最终输出位置的确定至少要经2次变换(如果你启用了世界坐标空间那是3次),有没有什么办法能够直接确定任意一个逻辑点最终会对应到那个物理位置呢?现成的没有,我们来自己实现一个,其实也并不复杂。首先要把逻辑坐标转化为设备坐标,这个过程要根据affine矩阵和当前映射模式做很多运算,但我们现在先不自己进行这种运算,而是使用BOOL LPtoDP( HDC hdc, // handle to device context LPPOINT lpPoints, // array of points int nCount // count of points in array);这个函数负责把lpPoints中的逻辑坐标转换为同hdc相关联的设备坐标。(稍后我们来自己完成这个函数)。因为设备坐标和物理设备坐标的单位是一致的,都是物理设备点。所以从设备坐标到物理设备坐标的转换没那么麻烦,只要知道了DC的原点就可以了(注意这里的原点是指设备坐标空间的原点在物理设备坐标空间中的位置)。这个任务的本质是去读取OS的DC结构,我们使用BOOL GetDCOrgEx( HDC hdc, // handle to a DC LPPOINT lpPoint // translation origin);来完成这一任务。这样的话,对于任意逻辑点logicalPoint,其DC原点为dcorgPoint有:physicaldevicePoint就是logicalPoint理论上在物理设备坐标空间中的位置。此处需要说明的是由于物理设备坐标空间并不一定涵盖图形设备的整个物理表面,所以从physicaldevicePoint计算出的位置并不一定就是物理表面上的位置。比如说打印的时候就还要加上四周的不可打印区域才是其实际位置。同时显示器一类的设备还要考虑物理设备本身有没有进行缩放,如果没有(也就是说没用显示器下边的那些钮)那么你就会发现我们计算出的尺寸同相应点在屏幕上的位置符合的挺好。void GetPhysicalPosition(HDC hDC,LPPOINT lpPoint ,int nCount)用于完成上述功能。具体实现见源码1。一、逻辑空间的坐标是如何转化为设备空间的坐标的?让我们先来澄清逻辑坐标空间内部是如何转化的。世界坐标空间到页面坐标空间的变换(二维affine(注三)变换):此过程中涉及到的各种变换,比如:相等、平移、缩放、映像、旋

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档