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

近年在学Win32的编制程序,看的是《Windows程序设计第5版》后生可畏书,那本书是云南人翻译的,有个别译法和陆上不均等,书中还大概有大器晚成部分荒谬的地点,超多时候须求中国和东瀛文对照阅读,下载请点击

Windows应用程序绘制图形时行使的是大器晚成种逻辑单位,每种逻辑单位的高低由映射情势决定,
那么些逻辑单位不仅能与设备单位(显示器或打印机上的三个像素点卡塔 尔(英语:State of Qatar)相符,也得以是意气风发种物理单
位(如毫米卡塔 尔(阿拉伯语:قطر‎,还足以是顾客自定义的生龙活虎种单位。在Windows应用程序中,只要与出口有提到,都
要使用映射方式。本文的指标是帮扶读者精通映射形式的局地基本知识,并对在选择中时常
现身的片段标题提出解决方案。

(1卡塔尔国Windows坐标系列
Windows坐标系分为逻辑坐标系和装置坐标系三种,GDI帮衬那三种坐标系。平日来讲,
GDI的文书和图表输出函数使用逻辑坐标,而在顾客区移动或按下鼠标的鼠标地点是运用配备坐标。
<1>逻辑坐标系是面向DC的坐标系,这种坐标不构思实际的配备项目,在绘图时,Windows会依照当前设置的投射方式将逻辑坐标调换为设备坐标。
<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或配备所能表示的渺小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点地点(0,
0)不节制在道具显示区域的左上角。

大器晚成、映射格局基本知识
当Windows应用程序在其顾客区绘制图形时,必须交给在顾客区的岗位,其职分用x和y
多少个坐标表示,x表示横坐标,y表示纵坐标。在具有的GDI绘制函数中,这个坐标使用的是生龙活虎种”逻辑单位”。当GDI函数将出口送到有些物理设备上时,Windows将逻辑坐标
转变到设备坐标(如荧屏或打印机的像素点卡塔 尔(英语:State of Qatar)。逻辑坐标和装置坐标的调换是由映射情势决
定的。映射情势被积累在设备条件中。GetMapMode函数用于从设备条件取妥贴前的映射情势,SetMapMode函数用于安装设备条件的映照方式。
1.逻辑坐标

 

好了,上面开纠正文:

逻辑坐标是独立于设备的,它与设备点的大大小小毫不相关。使用逻辑单位,是完结”所见即所得”的底子。当程序员在调用二个画线的GDI函数LineTo,画出25.4mm(1英寸)
长的线时,他并不要求思谋输出的是何种设备。若设备是VGA显示屏,Windows自动将其转会为九十几个像素点;若设备是四个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卡塔 尔(英语:State of Qatar) 
  
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_LOMET揽胜极光IC映射下)等等等等(看下图).

辉映格局定义了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卡塔 尔(英语:State of Qatar)是待转变的逻辑点,(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卡塔 尔(英语:State of Qatar)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg卡塔 尔(阿拉伯语:قطر‎是设备坐标的视口原点。在缺省的装置条件中,那三个点均设置为(0,0卡塔 尔(英语:State of Qatar),但它们能够变动。此公式意味着,逻辑点(xWinOrg,yWinOrg卡塔 尔(阿拉伯语:قطر‎总被映射为设备点(xViewOrg,yViewOrg卡塔 尔(英语:State of Qatar)。

 

 

Windows还是能够将视口(设备卡塔尔坐标转变为窗口(逻辑卡塔尔国坐标:

(3).映射情势

 

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

     
映射形式分明了在绘制图形时所根据的坐标系,它定义了逻辑单位的莫过于尺寸、坐标拉长趋向,全数映射形式的坐标原点均在器材出口区域(如客商区或打字与印刷区卡塔尔的左上角。别的,对于一些映射情势,客商还可以够自定义窗口的长度和宽窄,设置视图区的物理范围。
Windows定义了8种光彩夺目情势,见下表。
辉映情势使得技师可不要考虑输出设备的实际设备坐标系,而在一个合併的逻辑坐标系中开展图纸的绘图。

之所以只要记住伊始的公式,获得不错的呼应的参数,就能够画出需求的图样。

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

辉映方法(Mapping Mode卡塔 尔(英语:State of Qatar)
 逻辑单位               坐标轴方向
MM_TEXT(默许形式卡塔 尔(英语:State of Qatar)
 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平日在打字与印刷机上,单位是59%0磅(1磅=1/72英寸卡塔 尔(英语:State of Qatar)。

 

上述映射方式中又可分为以下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_LOMETENVISIONIC,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卡塔 尔(英语:State of Qatar):对应实际输出设备上程序猿设定的区域
1.窗口原点是指逻辑窗口坐标系的原点在视口(设备卡塔 尔(英语:State of Qatar)坐标系中的地点,视口原点是指设备实际出口区域的原点。
2.除了映射方式,窗口和视口也是决定叁个点的逻辑坐标如何转移为器械坐标的多少个成分。多少个点的逻辑坐标依照如下式子转变为器具坐标:
  设备(视口卡塔 尔(英语:State of Qatar)坐标 = 逻辑坐标 – 窗口原点坐标      + 视口原点坐标

//定义坐标映射情势
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福特ExplorerZSIZE和VERTSIZE时,可拿到呈现区域的宽窄和惊人;当nIndex
为HO陆风X8ZRES和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参数的装置卡塔 尔(英语:State of Qatar)的顶端。l
  SWP_NOCOPYBITS      
吐弃那些客商区的内容。若无一点名那么些参数,则客商区的平价内容将被保留,并在窗口的尺寸或地方变动以往被拷贝回看客区。l
  SWP_NOMOVE       保持如今的岗位(忽视x和y参数卡塔尔国。l  
SWP_NOOWNEPRADOZO安德拉DE奇骏       不改造具有者窗口在Z轴次序上的岗位。l  
SWP_NOREDRAW      
不重画变化。如若设置了那个标识,则不产生任何项指标浮动。那适用于顾客区、非客商区(包罗标题和滚动条卡塔 尔(阿拉伯语:قطر‎以致被移位窗口覆盖的父窗口的任何部分。当那些标识被安装的时候,应用程序必需精通地无效或重画要重画的窗口和父窗口的其它部分。l
  SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。l  
SWP_NOSENDCHANGING       幸免窗口选拔WM_WINDOWPOSCHANGING消息。l  
SWP_NOSIZE       保持近来的大小(忽视cx和cy参数卡塔 尔(英语:State of Qatar)。l   SWP_NOZOEnclaveDE兰德酷路泽  
    保持方今的次序(忽视pWndInsertAfter卡塔尔。l   SWP_SHOWWINDOW      
显示窗口。  
   
 
调用这么些成员函数以改换子窗口、弹出窗口和顶层窗口的深浅、地方和Z轴次序。窗口在显示屏上固守它们的Z轴次序排序。在Z轴次序上处于顶部的窗口将次第在装有其余窗口的顶上部分。子窗口的保有坐标都以顾客坐标(相对于父窗口客商区的左上角卡塔 尔(阿拉伯语:قطر‎。窗口能够被移位到Z轴次序的顶端,既可以够通过将
pWndInsertAfter参数设为&wndTopMost,并保障未有设置SWP_NOZO福睿斯DE哈弗标记,也得以经过设置窗口的Z轴次序使它投身全数现有的顶层窗口上方。当二个非顶层窗口被设为顶层窗口时,它有着的窗口也被设为顶层的。它的具有者不发生变化。借使顶层窗口被再次定位到Z轴次序的最底层(&wndBottom卡塔尔国或别的非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被成为非顶层窗口时,它具备的具有者和它具备的有着窗口都被变成非顶层窗口。假使既未有一点点名SWP_NOACTIVE标记也从未点名SWP_NOZO本田CR-VDE福睿斯标记(这代表应用程序要求窗口被同期激活并放入内定的Z轴次序卡塔尔国,则pWndInsertAfter参数中钦赐的值将只在下列条件下适用:l
  在pWndInsertAfter参数中既未有一点点名&wndTopMost也远非点名&wndNoTopMost。
 
 
这些窗口不是移动窗口。应用程序不可能激活三个非活动窗口但与此同偶然候又不把它带到Z轴次序的最上部。应用程序能够未有别的限定地改换活动窗口的Z轴次序。非顶层窗口恐怕具备叁个顶层窗口,可是反之则不树立。任何被顶层窗口具备的窗口(举例对话框卡塔 尔(英语:State of Qatar)都将和睦成为顶层窗口,以有限支撑全部被有着的窗口位于它们的具有者上方。在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_LOMETTucsonIC时,窗口的范围设为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室,100084卡塔 尔(阿拉伯语:قطر‎