您的位置:永利集团登录网址 > 网络安全 > Windows映射模式

Windows映射模式

2019-10-20 13:14

前段时间在学Win32的编制程序,看的是《Windows程序设计第5版》旭日东升书,这本书是安徽人翻译的,某些译法和陆地不均等,书中还会有一点不当的地方,非常多时候须要中罗马尼亚(România)语对照阅读,下载请点击

Windows应用程序绘制图形时使用的是后生可畏种逻辑单位,每一个逻辑单位的轻重由映射格局决定, 那么些逻辑单位不只能与设备单位(显示器或打字与印刷机上的贰个像素点)一样,也得以是豆蔻年华种物理单 位(如毫米),还足以是客户自定义的后生可畏种单位。在Windows应用程序中,只要与出口有关系,都 要使用映射情势。本文的指标是扶持读者通晓映射方式的局地基本知识,并对在选用中有时现身的片段题目建议实施方案。

(1)Windows坐标连串
Windows坐标系分为逻辑坐标系和设施坐标系三种,GDI协理这二种坐标系。通常来说,
GDI的文本和图片输出函数使用逻辑坐标,而在客商区移动或按下鼠标的鼠标地方是选拔配备坐标。
<1>逻辑坐标系是面向DC的坐标系,这种坐标不考虑现实的装置等级次序,在绘图时,Windows会依照当下安装的映射方式将逻辑坐标调换为器械坐标。
<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设施所能表示的渺小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点地点(0, 0)不限制在配备展现区域的左上角。

意气风发、映射方式基本知识
当Windows应用程序在其顾客区绘制图形时,必得付出在顾客区的职责,其职责用x和y 八个坐标表示,x表示横坐标,y表示纵坐标。在装有的GDI绘制函数中,这个坐标使用的是如日方升种"逻辑单位"。当GDI函数将出口送到有个别物理设备上时,Windows将逻辑坐标 调换到设备坐标(如荧屏或打印机的像素点)。逻辑坐标和设施坐标的调换是由映射形式决 定的。映射形式被积攒在装置条件中。GetMapMode函数用于从设备条件获得当前的映射格局,SetMapMode函数用于安装设备条件的映照形式。
1.逻辑坐标

 

好了,下边开放正文:

逻辑坐标是单独于设备的,它与设备点的朗朗上口毫无干系。使用逻辑单位,是落到实处"所见即所得"的基础。当程序猿在调用二个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并不供给思索输出的是何种设备。若设备是VGA显示屏,Windows自动将其转会为97个像素点;若设备是八个300dpi的激光打字与印刷机,Windows自动将其转会为300个像素点。

配备坐标系分为荧屏坐标系、窗口坐标系和客商区坐标系二种互相独立的坐标系。
1.显示器坐标系以显示器左上角为原点,一些与成套显示器有关的函数均使用显示屏坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是荧屏坐标。
2.窗口坐标系以窗口左上角为坐标原点,它包蕴窗口标题栏、菜单栏和工具栏等范围。
3.客户区坐标系以窗口客户区左上角为原点,首要用来客商区的绘图输出和窗口音讯的管理。鼠标音讯的坐标参数使用顾客区坐标,CDC类绘图成员函数使用与顾客区坐标对应的逻辑坐标。

在看到GDI(GDI Graphic Device Interface图形设备接口)辉映情势那龙马精神节的时候,书中又是逻辑坐标,又是器械坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。即便笔者后日还不曾完全读懂,不过自个儿感觉本人曾经引发了掌握这几个东西的主线,下边包车型大巴事物就当作本身的笔记吧:

2.装置坐标

 

1.逻辑坐标和器材坐标

Windows将GDI函数中内定的逻辑坐标映射为设备坐标,在享有的器械坐标种类中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。

(2)坐标之间的相互转变
 编制程序时,有的时候须求依照近年来的具体景况举行三种器材坐标之间或与逻辑坐标的互相转变。
1.MFC提供了四个函数CDC::DPtoLP()和CDC:: LPtoDP()用于装备坐标与逻辑坐标之间的相互转变。
2.MFC提供了三个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于荧屏坐标与客商区坐标的互动调换。

   首先,逻辑坐标这几个名词就让比比较多个人诚惶诚恐,确实,不能够“一概而论”地知道的翻译就不是好翻译   ------周豫才。哈哈,开个玩笑,我们要驾驭那八个东西,首先要想开如若你要用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)。

GetWindowRect() 获得的是在荧屏坐标系下的RECT(即以荧屏左上角为原点)
GetClientRect() 获得的是在客商区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏总计,仅仅是个轻重,重临值的左上角长久为0,0) 
  
CRect rect;

           图片 1

(2)显示器坐标,富含全体显示器,显示器的左上角为(0,0)。荧屏坐标用在WM_MOVE音讯中(对于非子窗口)甚至上面包车型地铁Windows函数中:CreateWindow和MoveWindow(都对此非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和ScreenToClient能够将顾客区域坐标转换到显示器区域坐标,或反之。

GetWindowRect(&rect);

要讲下边包车型大巴公式,将在先说一下视口(Viewport 台湾译作视埠)和窗口(Window 福建译作视窗)

(3)全窗口坐标,包蕴贰个主次的任何窗口,饱含标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备条件,能够将逻辑单位转变来窗口坐标。

ScreentoClient(&rect);

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

3.逻辑坐标与设备坐标的调换方式

不后生可畏致

其实公式拿出来,学数学的伴儿是否就懂了大约了,那么些公式相当的重大,通晓了那个公式,前边的居多东西就会清楚,首先,公式中的Window,WinOrg,WinExt,便是带了Win的事物,就是使用的逻辑坐标的值,就跟GDI函数中的同样,逻辑坐标的单位大概是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMETLANDIC映射下)等等等等(看下图).

照耀方式定义了Windows怎么着将GDI函数中钦命的逻辑坐标映射为设备坐标。要承袭研究映射情势大家要介绍Windows有关映射格局的某个术语:大家将逻辑坐标所在的坐标系称为"窗口",将器材坐标所在的坐标系称为"视口"。

CRect rect;

图片 2

"窗口"依赖于逻辑坐标,能够是像素点、分米或技术员想要的别的条件。

GetClient(&rect);
举个比如:有个单文书档案程序

说是大家在调用Win32函数绘图的时候,要领悟自身使用的单位(依照映射情势分明的)。因为绘图函数里的数值,使用的正是这么些单位,纵然暗中认可的MM_TEXT映射方式应用的单位纵然像素,然则众多时候任何单位也很有用,比方您要做贰个荧屏尺子的时候,你要用尺子量一下实体有几分米。尺子上的刻度就足以用别的的照耀模式来画。不过荧屏在体现的时候却不可能只知道逻辑坐标几毫米啊,荧屏得明白具体的像素地点才行啊!那今年,就要求利用上边的公式转换了。讲到这里,公式里的ViewExt/WinExt是如何看头就很显明了。那正是在那时此刻逻辑坐标系下(譬喻几毫米,打例如哈),实际上是地点映射格局表格里的单位)对应的器材坐标应该是稍微个像素!这样转变之后,获得实际的Viewport,正是该逻辑点在显示屏上的岗位。

"视口"注重于设备坐标(像素点)。平常,视口和客商区域等同。可是,如若技术员用GetWindowDC或CreateDC获取了二个装置条件,则视口也得以指全窗口坐标或显示器坐标。点(0,0)是客商区域的左上角。x的值向右增添,y的值向上扩张。

CRect rect;

所以说视口和窗口实际上是象征的同样块区域,只不过是因为单位和原点的不等,必要开展览放映射,逻辑单位正是窗口,正是Window,就是像素,分米,英寸,正是给人用的单位,正是道具非亲非故的单位,设备单位就是视口,正是Viewport,就不得不是像素,正是给道具用的单位,分明的龙精虎猛分米,在差别的道具上的像素数也许会有分别,所以是器材相关的单位。

对于具备映射形式,Windows都用上边多个公式将窗口坐标转变到视口坐标:

View调用GetWindwoRect(&rect), 获得的坐标是:左上角(33,99),右下角(1040,524),那是View相对于显示屏的坐标,当调用ScreenToClient(&rect),rect形成为:左上角(-2,-2),右上角(1007,423),-2,-2是client和window之间的区间差--border。

 

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

rect = CRect(0,0,1,1),当调用ClientToScreen(&rect),rect形成为:左上角(35,101),右上角(36,102),这是也是有2个单位的border的功力。

要小心的是在上述的5映射格局下,ViewExt/WinExt的比重都以曾经鲜明了,不可能退换的,借使要改成四个值,只好在MM_ISOTROPIC和MM_ANISOTROPIC映射情势下行使SetViewportExtEx()和SetWindowExtEx()改动。並且那五个函数在上头5种炫丽方式下无效。

里面,(xWindow,yWindows)是待调换的逻辑点,(xViewport,yViewport)是更改后的设备点。要是设备坐标是顾客区域坐标或全窗口坐标,则Windows在画二个对象前,还必需将这一个坐标转变来显示屏坐标。

Frame调用GetWindowRect(&rect),获得的坐标是:左上角(25,25),右下角(1050,551),那是Frame相对于显示屏的坐标,与View的坐标有差距是因为Frame还应该有菜单栏,工具栏。

末尾,那些映射方式,视口原点(ViewOrg),窗口原点(WinOrg)等,皆以道具内容(DC Device Context,又译作装置内容、设备上下文等)的性质,设备内容实在正是您绘制的区域。有二种BeginPaint(在WM_PAINT时绘制无效区域),GetDC是客商端区域(在立异时绘制整个顾客区域),GetWindowsDC是整个窗口区域(能够绘制包含窗口题目栏,菜单栏区域)。那几个文化细讲的话又是另黄金时代篇博客了

那七个公式使用了分别钦命窗口和视口原点的点:(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的设施条件中,这五个点均安装为(0,0),但它们得以更改。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。

 

 

Windows仍能将视口(设备)坐标调换为窗口(逻辑)坐标:

(3).映射形式

 

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

      映射方式明确了在绘制图形时所依据的坐标系,它定义了逻辑单位的实在尺寸、坐标增加势头,全部映射情势的坐标原点均在装置出口区域(如客户区或打印区)的左上角。另外,对于一些映射方式,客户还是能自定义窗口的长短和增长幅度,设置视图区的大意范围。
Windows定义了8种炫彩形式,见下表。
照耀情势使得程序员可不必考虑输出设备的具体设备坐标系,而在贰个集结的逻辑坐标系中张开图片的绘图。

就此如果记住领头的公式,得到正确的相应的参数,就足以画出供给的图样。

能够运用Windows提供的多个函数DPtoLP和LPtoDP在配备坐标及逻辑坐标之间交互调换。

辉映方法(Mapping Mode)
 逻辑单位               坐标轴方向
MM_TEXT(私下认可格局)
 1 pixel                X轴正方向朝右,Y轴正方向朝下

 

4.映射情势的连串

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)           自定义  

Windows定义了表1所列出的8种炫目方式。

    当绘制的图样须要随着窗口的尺寸更改而自动更换的时候,平时选拔MM_ISOTROPIC和MM_ANISOTROPIC映射方式。它们的独步一时差异就是后面一个的X轴和Y轴的逻辑单位的分寸是同样的,单词“isotropic”正是各种方向相等的野趣,此映射方式相符绘制圆或纺锤形。而实际上选拔中,日常给X轴和Y轴取分歧的比例,这时候选拔MM_ANISOTROPIC映射形式。单词“anisotropic”便是逐风度翩翩方向相异的意趣。

映 射 方 式 逻 辑 单 位 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_TEXT)下,逻辑坐标的趋向和单位与道具坐标的侧向和单位意气风发律,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设施坐标固然在缺省情势下其数值也未必一样,除了在偏下三种情况下:
  1.   窗口为非滚动窗口
  2.   窗口为滚动窗口,但垂直滚动条位于滚动边框的顶端,水平滚动条位于最左端,但假诺移动了滚动条那二种坐标就不平等了。

注:MM_TWIPS平日在打字与印刷机上,单位是51%0磅(1磅=1/72英寸)。

 

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

(4).自定义映射格局

  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英寸)。

“窗口”和“视口”的概念:
窗口(Window):对应逻辑坐标系上程序员设定的区域
视口(Viewport):对应实际输出设备上技士设定的区域
1.窗口原点是指逻辑窗口坐标系的原点在视口(设备)坐标系中的地方,视口原点是指设备实际出口区域的原点。
2.除了映射方式,窗口和视口也是决定一个点的逻辑坐标怎么着转移为器械坐标的多少个因素。叁个点的逻辑坐标依据如下式子转换为道具坐标:
  设备(视口)坐标 = 逻辑坐标 – 窗口原点坐标      + 视口原点坐标

//定义坐标映射方式
WINGDIAPI int   WINAPI SetMapMode(HDC, int);
此API函数在MFC中封装为CDC::virtual int SetMapMode(int nMapMode);

SetMapMode(hDC, MM_ISOTROPIC); 
SetWindowExt(64, 64); 
SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc, LOGPIXELSY)); 

//定义逻辑窗口区域,单位为逻辑单位(Logical)
WINGDIAPI BOOL  WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);

二、与映射情势有关的难题的化解
事实上选择中,程序员会遇到有的与突显情势有关的难题。譬喻OLEServer中映射方式的设置、怎样压缩逻辑坐标与设备坐标间互动转变的模型误差等。上面,小编就探讨一下那三个难点的减轻方法。
1.OLEServer中映射格局的设置方式

//设置逻辑窗口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL  WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y);
注意:SetWindowOrg(Ex) 独有在炫酷格局为MM_ANISOTROPIC或MM_ISOTROPIC时才有含义。

开采OLEServer应用程序时,假若程序猿直接调用SetMapMode函数将映射方式设置成衡量映射方式中的意气风发种后,在Windows95/98上程序会不荒谬运行,但在WindowsNT上对象出示的轻重比边框小。经过小编研讨后,发掘WindowsNT上OLEServer应使用基于逻辑英寸的映射方式。在研讨如何设置基于逻辑英寸的映照形式前,大家先介绍一下逻辑英寸的概念。

//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel)
WINGDIAPI BOOL  WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int cy);
留意:SetViewportExt(Ex) 唯有在炫丽方式为MM_ANISOTROPIC或MM_ISOTROPIC时才有含义。

Windows在体现时以"逻辑英寸"为单位,逻辑英寸比其实的英寸要大。假使Windows程序采用实际英寸,则日常的10磅文本在显示屏上就能小到差十分少难以辨认,由此Windows使用放大了的"逻辑英寸"来表示文本。逻辑英寸只影响显示,而不影响打字与印刷。

//设置视口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL  WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);

运用GetDeviceCaps函数可收获当前配备的各类力量,其首先个参数nIndex指示要获撤除息的品类。当nIndex为HO大切诺基ZSIZE和VERTSIZE时,可得到突显区域的上涨的幅度和冲天;当nIndex 为HOXC60ZRES和VERTRES时,可获取种种水平和垂直方向的像素数即分辨率;当nIndex的值为LOGPIXELSX 和LOGPIXELSY时,可获得水平和垂直方向每逻辑英寸所含像素数。

void   MoveWindow(   int   x,   int   y,   int   nWidth,   int   nHeight,   BOOL   bRepaint   =   TRUE   );   
void   MoveWindow(   LPCRECT   lpRect,   BOOL   bRepaint   =   TRUE   );   
 参数:
  x钦点了CWnd的左边包车型客车新任务。  
  y钦点了CWnd的最上部的新岗位。  
  nWidth内定了CWnd的新宽度。  
  nHeight钦点了CWnd的新的高峰度。  
  bRepaint钦定了是或不是要重画CWnd。纵然为TRUE,则CWnd象平时那样在OnPaint音讯管理函数中接受到一条WM_PAINT音讯。纵然那些参数为FALSE,则不会产生其余类型的重画操作。那应用于顾客区、非客商区(包含标题条和滚动条)和出于CWnd移动而透露的父窗口的别的界分。当以此参数为FALSE的时候,应用程序必得旗帜显著地使CWnd和父窗口中必得重画的部分无效或重画。lpRectCRect对象或RECT结构,钦命了新的尺寸和岗位。表达这几个函数改换窗口的义务和分寸。对于顶层的CWnd对象,x和y参数是相对于显示器的左上角的。对于子对象,它们是周旋于父窗口客商区的左上角的。  
  MoveWindow函数发送一条WM_GETMINMAXINFO音信。管理这么些消息时,CWnd获得八个改动最大和纤维的窗口缺省值的时机。假如传递给MoveWindow成员函数的参数抢先了那些值,则在WM_GETMINMAXINFO管理函数中能够用小小或最大值来代替这个值。   
    
  BOOL  CWnd::SetWindowPos(const  CWnd* pWndInsertAfter,  int   x, int  y, int  cx, int  cy,UINT  nFlags   );  
  重临值假使函数成功,则赶回非零值;不然再次来到0。  
  参数pWndInsertAfter标记了在Z轴次序上位居这些CWnd对象以前的CWnd对象。那一个参数能够是指向CWnd对象的指针,也足以是指向下列值的指针:l   wndBottom       将窗口放在Z轴次序的平底。假设那几个CWnd是一个顶层窗口,则窗口将错过它的顶层状态;系统将以此窗口放在别的具有窗口的最底层。l   wndTop       将窗口放在Z轴次序的最上端。l   wndTopMost       将窗口放在全体非顶层窗口的地点。那些窗口将保持它的顶层地方,尽管它失去了活动状态。wndNoTopMost       将窗口重新定位到独具非顶层窗口的最上部(那象征在享有的顶层窗口之下)。那些标记对那个曾经是非顶层窗口的窗口未有效用。有关那个函数以致那一个参数的利用准则参见表达部分。x钦点了窗口左侧的新岗位。y内定了窗口最上部的新职分。cx钦点了窗口的新宽度。cy钦命了窗口的新中度。nFlags钦点了尺寸和岗位选项。这么些参数能够是下列值的组合:l   SWP_DRAWFRAME       围绕窗口画出边框(在创设窗口的时候定义)。l   SWP_FRAMECHANGED       向窗口发送一条WM_NCCALCSIZE音讯,尽管窗口的抑扬顿挫不会转移。如果未有一点点名这些标记,则仅当窗口的分寸爆发变化时才发送 WM_NCCALCSIZE消息。l   SWP_HIDEWINDOW       遮掩窗口。SWP_NOACTIVATE       不激活窗口。若无设置这一个标识,则窗口将被激活并活动到顶层或非顶层窗口组(信赖于pWndInsertAfter参数的安装)的最上端。l   SWP_NOCOPYBITS       吐弃这些客户区的从头到尾的经过。若无一点名这一个参数,则顾客区的管事内容将被保存,并在窗口的分寸或岗位变动以往被拷贝回顾客区。l   SWP_NOMOVE       保持这几天的职位(忽视x和y参数)。l   SWP_NOOWNE宝马7系ZO君越DE哈弗       不退换具备者窗口在Z轴次序上的职位。l   SWP_NOREDRAW       不重画变化。假设设置了那些标识,则不发生别的项指标变迁。那适用于客商区、非客商区(包罗标题和滚动条)以致被移动窗口覆盖的父窗口的别样部分。当以此标识被安装的时候,应用程序必须明显地无效或重画要重画的窗口和父窗口的任何部分。l   SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。l   SWP_NOSENDCHANGING       幸免窗口接收WM_WINDOWPOSCHANGING消息。l   SWP_NOSIZE       保持近日的深浅(忽视cx和cy参数)。l   SWP_NOZOLANDDE途锐       保持前段时间的顺序(忽视pWndInsertAfter)。l   SWP_SHOWWINDOW       突显窗口。  
   
  调用那一个成员函数以改换子窗口、弹出窗口和顶层窗口的大大小小、地点和Z轴次序。窗口在显示屏上依照它们的Z轴次序排序。在Z轴次序上居于顶上部分的窗口将次第在享有别的窗口的最上部。子窗口的装有坐标皆以顾客坐标(相对于父窗口顾客区的左上角)。窗口可以被移动到Z轴次序的顶端,不只能够经过将 pWndInsertAfter参数设为&wndTopMost,并保证未有安装SWP_NOZOEscortDE奇骏标识,也得以透过安装窗口的Z轴次序使它身处全部现成的顶层窗口上方。当八个非顶层窗口被设为顶层窗口时,它具备的窗口也被设为顶层的。它的具备者不爆发变化。假若顶层窗口被再度定位到Z轴次序的平底(&wndBottom)或别的非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被形成非顶层窗口时,它装有的具备者和它抱有的具有窗口都被改成非顶层窗口。如若既未有一些名SWP_NOACTIVE标记也并未有一些名SWP_NOZO奥德赛DE凯雷德标记(这意味应用程序须求窗口被同期激活并放入钦命的Z轴次序),则pWndInsertAfter参数中钦赐的值将只在下列条件下适用:l   在pWndInsertAfter参数中既没有一些名&wndTopMost也未尝点名&wndNoTopMost。  
  这一个窗口不是移动窗口。应用程序无法激活三个非活动窗口但与此同时又不把它带到Z轴次序的最上端。应用程序能够没有任何限制地改动活动窗口的Z轴次序。非顶层窗口或然具备三个顶层窗口,不过反之则不创设。任何被顶层窗口具有的窗口(比方对话框)都将和煦成为顶层窗口,以确认保障全数被有着的窗口位于它们的具有者上方。在Windows   3.1或更新的版本中,能够将窗口移动到Z轴次序的顶上部分,并经过设置它们的WS_EX_TOPMOST风格而将之锁定在那。这种顶层窗口固然在失去活动状态以往也会维持顶层地点。举例,采用WinHelp的Always   On   Top命令会使赞助窗口变为顶层,而且在您回去应用程序之后它还维持可知。要创建叁个顶层窗口,应在调用SetWindowPos的时候将 pWndInsertAfter参数设为&wndTopMost,恐怕在成立窗口的时候设置WS_EX_TOPMOST风格。若是Z轴次序中包括了其他具备WS_EX_TOPMOST风格的窗口,则用&wndTopMost移动的窗口将被停放全部非顶层窗口的顶上部分,但是放在任何顶层窗口的上边。当应用程序激活一个不抱有WS_EX_TOPMOST风格的非活动窗口时,该窗口将被活动到具备非顶层窗口的下边,然则放在全部顶层窗口的花天酒地。要是在调用SetWindowPos的时候pWndInsertAfter参数被设为&wndBottom,并且CWnd是三个顶层窗口,则该窗口失去顶层状态(WS_EX_BOTTOM风格被消除),何况系统将窗口放在Z轴次序的底层。

在介绍了逻辑英寸的知识今后,非常轻易将OLEServer设置为依据逻辑英寸的照耀方式。假使技士仅仅调用SetMapMode(hdc,MM_LOENGLISH)来安装映射格局,当前的照耀格局为概略英寸,并非逻辑英寸。设置逻辑英寸必须自定义窗口和视口的限制,使xViewExt/xWinExt =0.01逻辑英寸中国水力电力对民有集团业平像素的罗列,当xViewExt=LOGPIXELSX,xWinExt=100时,其比率正好满意上述要求。

 

以下是设置映射方式的代码。

from:

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_LOMETXC60IC时,窗口的限定设为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的翻番,转变后就一直不精度的散失了。

总结,即使大家能够基于映射格局值的性格,逻辑坐标和器具坐标都取经简化的窗口和视口范围值的翻番,则逻辑坐标和设施坐标间的转会将尚未测量误差。

(小编地址:清华东军政高校学科技(science and technology)行业楼401室,一千84)

本文由永利集团登录网址发布于网络安全,转载请注明出处:Windows映射模式

关键词: