您的位置:澳门新葡8455最新网站 > 澳门新葡8455最新网站 > 澳门新葡8455最新网站:Windows映射模式,Windows的

澳门新葡8455最新网站:Windows映射模式,Windows的

发布时间:2019-10-12 06:30编辑:澳门新葡8455最新网站浏览(183)

    新近在学Win32的编制程序,看的是《Windows程序设计第5版》一书,那本书是青海人翻译的,有个别译法和陆上分歧样,书中还或许有部分荒谬的地点,相当多时候须要中加泰罗尼亚语对照阅读,下载请点击

    Windows应用程序绘制图形时选择的是一种逻辑单位,每一种逻辑单位的尺寸由映射形式决定, 那么些逻辑单位不仅可以够与器具单位(显示器或打字与印刷机上的三个像素点)同样,也得以是一种物理单 位(如分米),还能够是客商自定义的一种单位。在Windows应用程序中,只要与出口有关系,都 要使用映射形式。本文的指标是帮忙读者精晓映射形式的一些基本知识,并对在使用中常常出现的某个标题建议设计方案。

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

    好了,下边开始正文:

    逻辑坐标是单独于设备的,它与设备点的轻重缓急非亲非故。使用逻辑单位,是贯彻"所见即所得"的底子。当技术员在调用二个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并没有供给思索输出的是何种设备。若设备是VGA显示屏,Windows自动将其转化为97个像素点;若设备是二个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)。

               澳门新葡8455最新网站 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_LOMETCR-VIC映射下)等等等等(看下图).

    光彩夺目格局定义了Windows如何将GDI函数中钦赐的逻辑坐标映射为器材坐标。要持续研究映射形式大家要介绍Windows有关映射情势的一对术语:我们将逻辑坐标所在的坐标系称为"窗口",将配备坐标所在的坐标系称为"视口"。

    澳门新葡8455最新网站 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为HORubiconZSIZE和VERTSIZE时,可收获显示区域的小幅度和中度;当nIndex 为HO瑞虎ZRES和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_LOMETLacrosseIC时,窗口的范围设为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)

    本文由澳门新葡8455最新网站发布于澳门新葡8455最新网站,转载请注明出处:澳门新葡8455最新网站:Windows映射模式,Windows的

    关键词: