设备坐标的理解,Windows映射模式

作者: 计算机工程  发布:2019-09-23

近日在学Win32的编制程序,看的是《Windows程序设计第5版》一书,那本书是青海人翻译的,有个别译法和陆地差异,书中还恐怕有一部分谬误的地点,相当多时候需求中日语对照阅读,下载请点击

Windows应用程序绘制图形时采取的是一种逻辑单位,各种逻辑单位的轻重缓急由映射格局决定, 这些逻辑单位不仅能够与设备单位(显示器或打字与印刷机上的一个像素点)同样,也足以是一种物理单 位(如分米),还是能够是用户自定义的一种单位。在Windows应用程序中,只要与出口有涉嫌,都 要使用映射方式。本文的指标是帮助读者驾驭映射格局的一部分基本知识,并对在行使中时常 出现的一对标题建议施工方案。

一、映射模式基本知识
当Windows应用程序在其客商区绘制图形时,必得付出在客商区的职位,其地方用x和y 八个坐标表示,x表示横坐标,y表示纵坐标。在富有的GDI绘制函数中,那几个坐标使用的是一 种"逻辑单位"。当GDI函数将出口送到有些物理设备上时,Windows将逻辑坐标 转变到设备坐标(如显示器或打字与印刷机的像素点)。逻辑坐标和装置坐标的调换是由映射形式决 定的。映射方式被累积在装置条件中。GetMapMode函数用于从设备条件得到当前的映射格局,SetMapMode函数用于安装设备条件的映照格局。
1.逻辑坐标

好了,上面开首正文:

逻辑坐标是单独于设备的,它与设备点的深浅非亲非故。使用逻辑单位,是落到实处"所见即所得"的基本功。当程序猿在调用壹个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并无需思索输出的是何种设备。若设备是VGA显示屏,Windows自动将其转化为100个像素点;若设备是多个300dpi的激光打字与印刷机,Windows自动将其转会为300个像素点。

在看到GDI(GDI Graphic Device Interface图形设备接口)照耀格局这一节的时候,书中又是逻辑坐标,又是器具坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。即便自身前些天还从未完全读懂,不过自个儿认为自己已经吸引了接头那一个东西的主线,上边包车型客车东西就当作本人的笔记吧:

2.设备坐标

1.逻辑坐标和配备坐标

Windows将GDI函数中钦点的逻辑坐标映射为道具坐标,在具备的装置坐标体系中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。

   首先,逻辑坐标那么些名词就让非常多个人心惊胆战,确实,不能够“断章取义”地精通的翻译就不是好翻译   ------周樟寿。哈哈,开个玩笑,大家要领悟那七个东西,首先要想开假若你要用Win32要绘制二个东西,该怎么办吧?比方绘制一个矩形,若是大家调用的是Rectangle(hdc,30,20,50,80),(那几个函数的用法是Rectangle(hdc,left,top,right,bottom),作者叫雷正兴,不用谢小编)。能够观察,跟很多GDI函数一样,那个函数里面使用了无数数字,坐标。让大家想起一下小学文化,绘制四个事物,不止应当搞精晓他的长短,还相应搞明白她的单位,那么这里的30,20,50,80的单位是怎么啊?很两人会说,是像素!那个答案是对的,但是又不全对。事实上,Windows暗中同意的映照格局(Mapping Mode,简称就是MM)是MM_TEXT,在MM_TEXT映射格局(TEXT实际上跟文字未有多大关系,是这种映射方式下的坐标方向,从左到右,从上到下,跟文字阅读格局同样)下,那几个单位确实是像素。实际上,逻辑坐标和设施坐标的分别就在于他们的单位分化!

Windows中总结以下3种道具坐标,以满意各类分歧需要:

下边咱们拿出多少个公式

(1)顾客区域坐标,包蕴应用程序的客户区域,客商区域的左上角为(0,0)。

           图片 1

(2)荧屏坐标,蕴含整个荧屏,显示屏的左上角为(0,0)。显示器坐标用在WM_MOVE音信中(对于非子窗口)以及下边包车型客车Windows函数中:CreateWindow和MoveWindow(都对此非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和ScreenToClient能够将客商区域坐标调换成显示器区域坐标,或反之。

要讲上边的公式,将在先说一下视口(Viewport 海南译作视埠)和窗口(Window 辽宁译作视窗)

(3)全窗口坐标,富含贰个前后相继的百分百窗口,包罗题目条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC获得的窗口设备条件,能够将逻辑单位转换到窗口坐标。

率先,不要被这多少个名字吸引了,那八个坐标是跟映射有关的,跟显示屏坐标系,窗口坐标系,顾客端坐标系是对峙独立的多少个知识。

3.逻辑坐标与器具坐标的转移方式

事实上公式拿出来,学数学的伴儿是否就懂了大概了,那些公式特别主要,精晓了那个公式,后面包车型大巴繁多事物就能够清楚,首先,公式中的Window,WinOrg,WinExt,正是带了Win的事物,正是应用的逻辑坐标的值,就跟GDI函数中的同样,逻辑坐标的单位恐怕是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMETENVISIONIC映射下)等等等等(看下图).

辉映方式定义了Windows怎样将GDI函数中钦命的逻辑坐标映射为器具坐标。要承袭讨论映射方式我们要介绍Windows有关映射方式的部分术语:大家将逻辑坐标所在的坐标系称为"窗口",将配备坐标所在的坐标系称为"视口"。

图片 2

"窗口"信赖于逻辑坐标,能够是像素点、分米或程序猿想要的别样规格。

正是大家在调用Win32函数绘图的时候,要领悟本身使用的单位(依据映射情势分明的)。因为绘图函数里的数值,使用的便是这个单位,尽管暗许的MM_TEXT映射格局选拔的单位就算像素,可是众多时候任何单位也很有用,比如您要做二个显示器尺子的时候,你要用尺子量一下物体有几分米。尺子上的刻度就足以用任何的炫丽情势来画。可是荧屏在显示的时候却不可能只晓得逻辑坐标几毫米啊,荧屏得明白具体的像素地点才行啊!那这一年,就须要运用上边包车型客车公式调换了。讲到这里,公式里的ViewExt/WinExt是怎么意思就很显眼了。那就是在日前逻辑坐标系下(举个例子几毫米,打比方哈),实际上是上面映射方式表格里的单位)对应的设施坐标应该是稍稍个像素!那样转变之后,得到实质上的Viewport,就是该逻辑点在显示屏上的地方。

"视口"注重于设备坐标(像素点)。常常,视口和顾客区域等同。不过,就算程序猿用GetWindowDC或CreateDC获取了四个装置条件,则视口也得以指全窗口坐标或显示器坐标。点(0,0)是顾客区域的左上角。x的值向右扩充,y的值向上扩充。

因此说视口和窗口实际上是表示的一致块区域,只但是是因为单位和原点的不及,要求开展览放映射,逻辑单位正是窗口,正是Window,就是像素,分米,英寸,正是给人用的单位,就是器具毫无干系的单位,设备单位就是视口,就是Viewport,就只好是像素,正是给器械用的单位,显著的一厘米,在分化的器械上的像素数只怕会有分别,所以是道具相关的单位。

对此有着映射方式,Windows都用上边四个公式将窗口坐标调换到视口坐标:

 

  1. xViewport = (xWindow - xWinOrg) * (xViewExt / xWinExt) + xViewOrg
  2. yViewport = (yWindow - yWinOrg) * (yViewExt / yWinExt) + yViewOrg

要留意的是在上述的5映射形式下,ViewExt/WinExt的百分比都以现已明显了,无法改动的,即使要退换多少个值,只可以在MM_ISOTROPIC和MM_ANISOTROPIC映射形式下使用SetViewportExtEx()和SetWindowExtEx()更动。并且那五个函数在地方5种绚烂方式下无效。

中间,(xWindow,yWindows)是待转变的逻辑点,(xViewport,yViewport)是改变后的设备点。借使设备坐标是客商区域坐标或全窗口坐标,则Windows在画二个目的前,还必需将这个坐标转变到荧屏坐标。

最后,这个映射形式,视口原点(ViewOrg),窗口原点(WinOrg)等,都以设备内容(DC Device Context,又译作装置内容、设备上下文等)的天性,设备内容其实正是您绘制的区域。有二种BeginPaint(在WM_PAINT时绘制无效区域),GetDC是顾客端区域(在立异时绘制整个顾客区域),GetWindowsDC是全体窗口区域(能够绘制包蕴窗口标题栏,菜单栏区域)。那些文化细讲的话又是另一篇博客了

那五个公式使用了各自钦赐窗口和视口原点的点:(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的装置条件中,那五个点均设置为(0,0),但它们能够变动。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。

 

Windows还能够将视口(设备)坐标转换为窗口(逻辑)坐标:

 

  1. xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg
  2. yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg

据此只要记住最初的公式,获得不错的对应的参数,就可以画出需求的图样。

能够运用Windows提供的多少个函数DPtoLP和LPtoDP在装置坐标及逻辑坐标之间互相调换。

 

4.映射形式的项目

Windows定义了表1所列出的8种炫目格局。

映 射 方 式 逻 辑 单 位 X 轴 增 加 Y 轴 增 加 毫 米
MM_TEXT 像 素 点 与 设 备 有 关
MM_LOMETRIC 0. 1mm 0.1
MM_HIMETRIC 0. 01mm 0.01
MM_LOENGLISH 0. 01英寸 0.254
MM_HIENGLISH 0.001英寸 0.0254
MM_TWIPS 1/1440英寸 0.0176
MM_ISOTROPIC 任 意(x=y) 可 选 可 选 可 设
MM_ANISOTROPIC 任 意(x!=y) 可 选 可 选 可 设

注:MM_TWIPS平常在打字与印刷机上,单位是四分之一0磅(1磅=1/72英寸)。

上述映射形式中又可分为以下3类:

  1. MM_TEXT映射形式这种映射方式被称为"文本"映射格局,不是因为它对 于文本最合适,而是轴的趋势与读文件的趋向同样。Windows提供了函数SetViewportOrg和SetWindowOrg 用来设置视口和窗口的原点。缺省的窗口原点和视口原点均为(0,0),能够改变;缺省的窗 口范围和视口范围均为(1,1),不可改换。
  2. 胸怀映射情势MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH和MM_TWIPS 将1个逻辑单位映射为定点的莫过于单位,当中1twip对等0.0176mm(1/1440英寸)。其余映射形式对应的情理单位参见表1。设置了炫人眼目格局之后,Windows自动设置了窗口及视口的限定,范围自身的值并不主要,但范围比是一个一定的值,对于MM_LOMET瑞鹰IC,Windows总计范围比xViewExt/xWinExt=0.1mm中国水力电力对民有集团业平像素的罗列。
  3. 自定义映射形式MM_ISOTROPIC和MM_ANISOTROPIC三种炫目方式允许技师设置本身的窗口和视口范围。MM_ISOTROPIC和MM_ANISOTROPIC的分别是所设置的x轴和y轴的的限定必得一致,而MM_ANISOTROPIC所设置的x轴和y轴的的范围可以不一样。isotropi的情致是" 在有着矛头一致",anisotropic的情趣正相反。自定义映射情势中窗口和视口的原点和限制都足以改动,程序员能够设置本身索要的映照情势。函数SetWindowExt和SetViewportExt 用于转移窗口和视口的范围。上面包车型地铁代码将1个逻辑单位映射成0.396mm(1/64英寸)。
SetMapMode(hDC, MM_ISOTROPIC); 
SetWindowExt(64, 64); 
SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc, LOGPIXELSY)); 

二、与映射方式有关的题指标化解
实际利用中,技术员会遭逢一些与展现格局有关的主题材料。举例OLEServer中映射形式的安装、怎么着收缩逻辑坐标与道具坐标间互动转变的引用误差等。下边,我就商量一下那七个难点的化解方法。
1.OLEServer中映射格局的安装情势

开采OLEServer应用程序时,如若程序猿直接调用SetMapMode函数将映射格局设置成衡量映射情势中的一种后,在Windows95/98上程序会正常运维,但在WindowsNT上对象出示的轻重比边框小。经过笔者商讨后,开掘WindowsNT上OLEServer应使用基于逻辑英寸的投射格局。在斟酌如何设置基于逻辑英寸的映射形式前,我们先介绍一下逻辑英寸的概念。

Windows在呈现时以"逻辑英寸"为单位,逻辑英寸比实际的英寸要大。假若Windows程序行使实际英寸,则一般的10磅文本在显示器上就能小到差不离难以辨认,因此Windows使用放大了的"逻辑英寸"来表示文本。逻辑英寸只影响展现,而不影响打字与印刷。

利用GetDeviceCaps函数可获得当前道具的各样力量,其首先个参数nIndex提示要获取消息的品种。当nIndex为HO大切诺基ZSIZE和VERTSIZE时,可获取显示区域的小幅度和惊人;当nIndex 为HOGL450ZRES和VERTRES时,可取得每一种水平和垂直方向的像素数即分辨率;当nIndex的值为LOGPIXELSX 和LOGPIXELSY时,可获得水平和垂直方向每逻辑英寸所含像素数。

在介绍了逻辑英寸的学识今后,很轻便将OLEServer设置为基于逻辑英寸的炫丽方式。尽管程序猿仅仅调用SetMapMode(hdc,MM_LOENGLISH)来设置映射形式,当前的炫目情势为大意英寸,实际不是逻辑英寸。设置逻辑英寸必得自定义窗口和视口的限定,使xViewExt/xWinExt =0.01逻辑英寸中国水力电力对民有公司业平像素的罗列,当xViewExt=LOGPIXELSX,xWinExt=100时,其比率正好知足上述须要。

以下是设置映射情势的代码。

intxLogPixPerInch = GetDeviceCaps(hdc, LOGPIXELSX); 
intyLogPixPerInch = GetDeviceCaps(hdc, LOGPIXELSY); 
SetMapMode(MM_ANISOTROPIC); 
SetWindowExt(100, 100); 
SetViewportExt(xLogPixPerInch, yLogPixPerInch); 

上述代码中调用SetMapMode函数将映射方式设置为自定义的,该调用必得放在SetWindowExt 和SetViewportExt调用此前,不然设置将会没有抓住要点。
上述代码实际元帅映射形式设置成逻辑MM_LOENGLISH,若技师供给安装逻辑MM_LOMETRIC、MM_HIMETRIC、MM_HIENGLISH 或MM_TWIPS,只需修改上述代码中的SetWindowExt的参数,该参数实际上是每英寸所富含的各类映射形式下的单位数。根据表1中各映射格局的参数,可拿到表2中每英寸所对应的各逻辑单位的个数。

比方说,要设置逻辑MM_TWIPS,函数SetWindowExt中的参数为应1440。

2.逻辑坐标与器具坐标调换时基值误差的管理

表2

映 射 模 式 每 英 寸 所 对 应 的 逻 辑 单 位 数
MM_LOENGLISH 100
MM_HIENGLISH 1000
MM_LOMETRIC 254
MM_HIMETRIC 2540
MM_TWIPS 1440

当我们将映射形式设置成基于逻辑英寸的MM_LOMET哈弗IC时,窗口的界定设为256,视口的界定设为96(在VGA显示屏下LOGPIXELSX的值),约2.6个逻辑单位对应1个像素,那明明会变成比相当的大的抽样误差,它会呈未来应用程序的各样方面:客商区的多少个局地从没被刷新;对象之间自然未有距离,却呈现出有间距;对象在显示器的分化职责上会减少或附加贰个像素等主题材料。

能够行使以下多个步骤幸免调换相对误差。(1)尽量挑选窗口范围和视口范围比能够整除的映照情势,比方基于逻辑英寸的MM_TWIPS其窗口范围和视口范围比1440/96,可简化为15/1,从设备坐标转化为逻辑坐标前卫未相对误差,从化解相对误差角度看,MM_TWIPS比别的几个映射形式都要好。(2)窗口范围和视口范围比不可能整除时,也硬着头皮将其简化,举个例子,当使用0.3900mm 中的将1个逻辑单位映射成1/64英寸的投射格局时,其窗口范围和视口范围比值为64/96,可简化为2/3。如若大家将逻辑单位的值都取为2的倍数,设备单位的值都取为3的倍数,转变后就平素不精度的散失了。

总结,借使大家能够依据映射形式值的特点,逻辑坐标和设施坐标都取经简化的窗口和视口范围值的倍数,则逻辑坐标和装置坐标间的中转将从未相对误差。

(小编地址:北大东军事和政院学科学技术产业楼401室,一千84)

本文由贝博体育app发布于计算机工程,转载请注明出处:设备坐标的理解,Windows映射模式

关键词:

上一篇:没有了
下一篇:没有了