Windows映射方式,设备坐标的精晓

时间:2019-09-26 04:52来源:永利皇宫463手机版
近来在学Win32的编程,看的是《Windows程序设计第5版》一书,那本书是新疆人翻译的,有个别译法和陆地分歧,书中还应该有局部不当的地点,非常多时候供给中国和大韩民国时期文对照

近来在学Win32的编程,看的是《Windows程序设计第5版》一书,那本书是新疆人翻译的,有个别译法和陆地分歧,书中还应该有局部不当的地点,非常多时候供给中国和大韩民国时期文对照阅读,下载请点击

Windows应用程序绘制图形时利用的是一种逻辑单位,种种逻辑单位的高低由映射方式决定, 那些逻辑单位不只能够与器械单位(荧屏或打字与印刷机上的三个像素点)同样,也能够是一种物理单 位(如分米),还能够是顾客自定义的一种单位。在Windows应用程序中,只要与出口有提到,都 要使用映射格局。本文的指标是扶助读者了然映射方式的片段基本知识,并对在运用中时常 现身的一部分主题素材建议建设方案。

一、映射模式基本知识
当Windows应用程序在其客商区绘制图形时,必须付出在客商区的地点,其地方用x和y 五个坐标表示,x表示横坐标,y表示纵坐标。在颇具的GDI绘制函数中,那一个坐标使用的是一 种"逻辑单位"。当GDI函数将出口送到有些物理设备上时,Windows将逻辑坐标 转变到设备坐标(如显示器或打印机的像素点)。逻辑坐标和装置坐标的更改是由映射形式决 定的。映射形式被储存在装置条件中。GetMapMode函数用于从设备条件获得当前的投射方式,SetMapMode函数用于安装设备条件的映射情势。
1.逻辑坐标

好了,下边起头正文:

逻辑坐标是单身于设备的,它与设备点的分寸毫不相关。使用逻辑单位,是落实"所见即所得"的根基。当程序猿在调用贰个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并无需思虑输出的是何种设备。若设备是VGA显示屏,Windows自动将其转会为玖拾陆个像素点;若设备是四个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_LOMET福睿斯IC映射下)等等等等(看下图).

照耀方式定义了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奔驰G级ZSIZE和VERTSIZE时,可得到展现区域的宽窄和可观;当nIndex 为HOPAJEROZRES和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)

编辑:永利皇宫463手机版 本文来源:Windows映射方式,设备坐标的精晓

关键词:

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